Python解码JSON

时间:2011-03-23 14:50:45

标签: python json python-3.x

我有以下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"))  

Python的内置JSON API范围是否足以达到此预期?

6 个答案:

答案 0 :(得分:10)

您似乎需要帮助迭代返回的对象,以及解码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))

答案 1 :(得分:9)

尝试

obj = json.loads(jstr)

而不是

obj = json.JSONDecoder(jstr)

答案 2 :(得分:4)

我猜这笔交易是你创建一个解码器,但绝不告诉decode()

使用:

o = json.JSONDecoder().decode(jstr)

答案 3 :(得分:3)

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

答案 4 :(得分:2)

这对我来说效果很好,打印比在Thanatos' answer中显式循环对象更简单:

import json
from pprint import pprint

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

pprint(obj)

这使用“Data Pretty Printer”(pprint)模块,其文档可以找到here

答案 5 :(得分:1)

示例中提供的字符串无效JSON。

两个结束花括号之间的最后一个逗号是非法的。

无论如何,你应该遵循Sven的建议并改用负载。