如何在Python中解析JSON?


281

我的项目目前正在python中接收JSON消息,我需要从中获取一些信息。为此,我们将其设置为字符串中的一些简单JSON:

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'

到目前为止,我一直在使用列表生成JSON请求json.dumps,但是与此相反,我认为我需要使用json.loads。但是我没有那么幸运。谁能为我提供一个片段,该片段将在上述示例"2"的输入中返回"two"


8
注意:对于那些附带使用'单引号字符串定界符的数据的用户,您可能不小心为Python字典创建了字符串表示形式。JSON将始终使用"定界符。如果是的话,修复您的代码,它产生的输出使用json.dumps()代替str()repr()和头部到转换字典的字符串表示的字典?弄清楚如何恢复您的Python数据。您有Python文字的其他提示吗?寻找NoneTrue或者False,JSON会使用nulltruefalse
马丁·彼得斯

那些没有jsonStr但词典列表(可能与谁'单引号字符串分隔符),也看看这里:stackoverflow.com/questions/41168558/...
洛伦茨

Answers:


491

很简单:

import json
data = json.loads('{"one" : "1", "two" : "2", "three" : "3"}')
print data['two']

另外,如果需要更好的性能,请查看simplejson。较新的版本提供了优化功能,可以极大地改善读取和写入。
2011年

2
我实际上已经在使用simplejson :import simplejson as json。忘记提了,但谢谢:)
ingh.am 2011年

得到它了。使用的是.load方法而非.loads
Sunil Kumar,

85

有时,您的json不是字符串。例如,如果您从这样的网址获取json:

j = urllib2.urlopen('http://site.com/data.json')

您将需要使用json.load,而不是json.loads:

j_obj = json.load(j)

(很容易忘记:“ s”代表“字符串”)


只需添加一下,您就可以通过调用j.read()来获取字符串内容,然后使用loads方法。在这种情况下,无论如何,load()方法都会负责调用.read()
rkachach 2013年

51

对于URL或文件,请使用json.load()。对于具有.json内容的字符串,请使用json.loads()

#! /usr/bin/python

import json
# from pprint import pprint

json_file = 'my_cube.json'
cube = '1'

with open(json_file) as json_data:
    data = json.load(json_data)

# pprint(data)

print "Dimension: ", data['cubes'][cube]['dim']
print "Measures:  ", data['cubes'][cube]['meas']

26

以下是可能帮助您的简单示例:

json_string = """
{
    "pk": 1, 
    "fa": "cc.ee", 
    "fb": {
        "fc": "", 
        "fd_id": "12345"
    }
}"""

import json
data = json.loads(json_string)
if data["fa"] == "cc.ee":
    data["fb"]["new_key"] = "cc.ee was present!"

print json.dumps(data)

上面代码的输出将是:

{"pk": 1, "fb": {"new_key": "cc.ee was present!", "fd_id": "12345", 
 "fc": ""}, "fa": "cc.ee"}

请注意,您可以设置dump的ident参数来像这样打印它(例如,当使用print json.dumps(data,indent = 4)时):

{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}

-2

可以使用json或ast python模块:

Using json :
=============

import json
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_data = json.loads(jsonStr)
print(f"json_data: {json_data}")
print(f"json_data['two']: {json_data['two']}")

Output:
json_data: {'one': '1', 'two': '2', 'three': '3'}
json_data['two']: 2




Using ast:
==========

import ast
jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
json_dict = ast.literal_eval(jsonStr)
print(f"json_dict: {json_dict}")
print(f"json_dict['two']: {json_dict['two']}")

Output:
json_dict: {'one': '1', 'two': '2', 'three': '3'}
json_dict['two']: 2

1
您不能将ast.literal_eval()函数用于JSON,因为除了琐碎的纯文本和整数示例之外,您还会遇到问题。JSON不是Python。仅仅因为可以解析某些 JSON ast.literal_eval()并不能成为一种正确的方法。
马丁·彼得斯

1
例如,您不能r'{"foo": null, "bar": true, "baz": "\ud83e\udd26"}'使用进行解析ast.literal_eval(),因为它包含空值,布尔值和单个非BMP代码点。JSON表示这些值与Python文字表示这些值的方式不同。json.loads()在另一方面,具有与输入没有问题,并正确解码,要{'foo': None, 'bar': True, 'baz': '🤦'}
的Martijn Pieters的

1
接下来,ast.literal_eval()速度要慢得多,并且无法自定义。您永远不要将其用于解码JSON
马丁·彼得斯
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.