使用Python将JSON字符串转换为dict


415

我对Python中的JSON感到有些困惑。在我看来,这就像是一本字典,因此我正在尝试这样做:

{
    "glossary":
    {
        "title": "example glossary",
        "GlossDiv":
        {
            "title": "S",
            "GlossList":
            {
                "GlossEntry":
                {
                    "ID": "SGML",
                    "SortAs": "SGML",
                    "GlossTerm": "Standard Generalized Markup Language",
                    "Acronym": "SGML",
                    "Abbrev": "ISO 8879:1986",
                    "GlossDef":
                    {
                        "para": "A meta-markup language, used to create markup languages such as DocBook.",
                        "GlossSeeAlso": ["GML", "XML"]
                    },
                    "GlossSee": "markup"
                }
            }
        }
    }
}

但是当我这样做时print dict(json),它会给出一个错误。

如何将该字符串转换为结构,然后调用json["title"]以获得“示例词汇表”?

Answers:


756

json.loads()

import json

d = json.loads(j)
print d['glossary']['title']

9
json.load和json.loads有什么区别?
Shivam Agrawal,2015年

5
@ ShivamAgrawal:正好在罐头上什么。
伊格纳西奥·巴斯克斯

64
@ShivamAgrawal:区别在于.load()解析文件对象;.loads()解析一个字符串/ unicode对象。
fyngyrz

1
令我困扰的是该函数的作者没有编写包装函数来对要传递的数据进行类型检查以自动选择要调用的函数。我也不喜欢使用含糊的术语。这是我为解决此问题而写的内容: def read_json(json_data): if (type(json_data) == str): return json.loads(json_data) elif (str(type(json_data)) == "<class '_io.TextIOWrapper'>"): return json.load(json_data) 我敢肯定它可以改善,但是现在您可以调用d = read_json(j)json'str'或'file'了。
雅克·马修

2
@JacquesMathieu,您好,Jacques,thanx,由于我有时使用字典,因此做了一些小的改进:def read_json(json_data):if(type(json_data)== str):#对于字符串返回json.loads(json_data)elif (str(type(json_data))==“ <class'_io.TextIOWrapper'>”):#对于文件返回json.load(json_data)elif(type(json_data)== dict):#对于字典返回json.loads (json.dumps(json_data))
Gabriel Aizcorbe

98

当我开始使用json时,我很困惑,无法解决一段时间,但最终我得到了想要的东西。
这是简单的解决方案

import json
m = {'id': 2, 'name': 'hussain'}
n = json.dumps(m)
o = json.loads(n)
print(o['id'], o['name'])

你为什么先卸货?
Han Van Pham

我用它来演示序列化和反序列化。像接受的答案一样,使用loads(..)on '{"id": 2, "name": "hussain"}'也应该很好。
侯赛因

1
转储和加载对我来说是完美的,而可接受的答案不是,非常感谢@Hussain为我节省了一个time,仅供参考,我正在尝试loads从采用utf-8编码的动态字符串中提取...
Mohammed Sufian

19

使用simplejson或cjson进行加速

import simplejson as json

json.loads(obj)

or 

cjson.decode(obj)

16

如果您信任数据源,则可以用于eval将字符串转换为字典:

eval(your_json_format_string)

例:

>>> x = "{'a' : 1, 'b' : True, 'c' : 'C'}"
>>> y = eval(x)

>>> print x
{'a' : 1, 'b' : True, 'c' : 'C'}
>>> print y
{'a': 1, 'c': 'C', 'b': True}

>>> print type(x), type(y)
<type 'str'> <type 'dict'>

>>> print y['a'], type(y['a'])
1 <type 'int'>

>>> print y['a'], type(y['b'])
1 <type 'bool'>

>>> print y['a'], type(y['c'])
1 <type 'str'>

1
您的示例中的字符串不是JSON。
bfontaine

1
真正。它相当于一个字典tho,可以轻松地将其作为JSON加载/转储(当然,如果字典没有json值,则可能需要自定义json编码器函数)。
kakhkAtion

3
不能。您永远不要将输入数据视为代码。这可能是您使用信任数据的小项目,但是在真实项目中可以重复使用错误的代码,并重复错误的做法,从而留下大量的安全代码。
NetworkMeister

这就是为什么我的回答从“如果您信任数据源”开始!但是,确实,这更多的是破解,而且绝对不是最佳实践。
kakhkAtion

如果数据源是您自己的,则可以完全信任它。实际上,这对于将字符串化的JS对象转换为dic以及适当的JSON字符串很有用。
Vadorequest,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.