Python декодирует JSON - PullRequest
       4

Python декодирует JSON

5 голосов
/ 23 марта 2011

У меня есть следующий json:

{
    "slate" : {
        "id" : {
            "type" : "integer"
        },
        "name" : {
            "type" : "string"
        },
        "code" : {
            "type" : "integer",
            "fk" : "banned.id"
        }
    },
    "banned" : {
        "id" : {
            "type" : "integer"
        },
        "domain" : {
            "type" : "string"
        }
    }
}

Я бы хотел выяснить, лучший способ декодирования, чтобы его можно было легко просмотреть с помощью объекта Python.

Я пытался:

import json

jstr = #### my json code above #### 
obj = json.JSONDecoder().decode(jstr)

for o in obj:
  for t in o: 
    print (o)

Но я получаю:

    f       
    s
    l
    a
    t
    e
    b
    a
    n
    n
    e
    d

И я не понимаю, в чем дело. Идеальным вариантом было бы дерево (даже список, организованный в виде дерева), которое я мог бы просматривать следующим образом:

for table in myList:
    for field in table:
         print (field("type"))
         print (field("fk"))  

Достаточно ли широк встроенный в JSON API-интерфейс Python, чтобы оправдать это ожидание?

Ответы [ 6 ]

10 голосов
/ 23 марта 2011

Похоже, вам нужна помощь для перебора возвращаемого объекта, а также для декодирования JSON.

import json

#jstr = "... that thing above ..."
# This line only decodes the JSON into a structure in memory:
obj = json.loads(jstr)
# obj, in this case, is a dictionary, a built-in Python type.

# These lines just iterate over that structure.
for ka, va in obj.iteritems():
    print ka
    for kb, vb in va.iteritems():
        print '  ' + kb
        for key, string in vb.iteritems():
            print '    ' + repr((key, string))
9 голосов
/ 23 марта 2011

Попробуйте

obj = json.loads(jstr)

вместо

obj = json.JSONDecoder(jstr)
4 голосов
/ 23 марта 2011

Дело в том, что вы создаете декодер, но никогда не говорите ему decode().

Использование:

o = json.JSONDecoder().decode(jstr)
3 голосов
/ 23 марта 2011

Подпись JSONDecoder

class json.JSONDecoder([encoding[, object_hook[, parse_float[, parse_int[, 
    parse_constant[, strict[, object_pairs_hook]]]]]]])

и не принимает строку JSON в конструкторе. Посмотрите на его метод decode ().

http://docs.python.org/library/json.html#json.JSONDecoder

2 голосов
/ 15 апреля 2013

Это хорошо сработало для меня, и печать проще, чем явное зацикливание объекта, как в ответе Танатоса :

import json
from pprint import pprint

jstr = #### my json code above #### 
obj = json.loads(jstr)

pprint(obj)

При этом используется «Data Pretty Printer» (pprint) модуль, документацию к которому можно найти здесь .

1 голос
/ 23 марта 2011

Указанная в примере строка недопустима в формате JSON.

Последняя запятая между двумя закрывающими фигурными скобками недопустима.

В любом случае вам следует следовать предложению Свена и использовать вместо него нагрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...