2010-05-30 4 views
0

У меня есть json из api last.fm, который я сериализую в словаре, используя simplejson. Ниже приведен краткий пример базовой структуры.Python как обрабатывать # в словаре

 
{ "artist": 
    "similar": { 
     "artist": { 
      "name": "Blah", 
      "image": [{"#text":"URLHERE","size": "small"},{"#text":"URLHERE","size":"medium"},{"#text":"URLHERE","size":"large"}] 
     } 
    } 
} 

Любые идеи, как я могу получить доступ к изображениям URL разных размеров?

Спасибо,
Джек

+1

Возможно, вы должны вставить часть своего кода на Python или немного уточнить. Поиск строкового ключа в словаре, который содержит «#», отлично работает: >>> x = {"#foo": "bar"} >>> x ["# foo"] 'bar' – whaley

ответ

4

Python не имеет никаких проблем с # в строках, используемых в качестве ключей Dict.

>>> import json 
>>> j = '{"#foo": 6}' 
>>> print json.loads(j) 
{u'#foo': 6} 
>>> print json.loads(j)[u'#foo'] 
6 
>>> print json.loads(j)['#foo'] 
6 

Есть, однако, проблемы с JSON, которые вы публикуете. Во-первых, это неверно (возможно, вам не хватает пары запятых?). Для двоих у вас есть объект JSON с одним и тем же ключевым «изображением» три раза, который не может сосуществовать и делать что-нибудь полезное.

+0

А, ваш о том, что JSON ошибается. Я исправил это сейчас, любые идеи, как получить доступ к URL в зависимости от размера, который я хочу? – Jack

3

В Javascript, эти два Синтаксисы эквивалентны:

o.foo 
o['foo'] 

В Python они не являются. Первый дает вам атрибут foo, второй дает вам ключ foo. (Это спорный вопрос, было ли это хорошая идея или нет.) В Python, вы не сможете получить доступ к #text как:

o.#text 

, поскольку хэш начинает комментарий, и вы будете иметь синтаксическую ошибку ,

Но вы хотите

o['#text'] 

в любом случае.

0

Вы можете получить то, что хотите от списка изображений, со списком. Что-то вроде

desired = [x for x in images if minSize < x['size'] < maxSize] 

Здесь изображения будут списком dicts с внутреннего уровня вашей структуры данных.

Смежные вопросы