Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何解析JSON格式的数据?_Python_Json_Parsing - Fatal编程技术网

Python 如何解析JSON格式的数据?

Python 如何解析JSON格式的数据?,python,json,parsing,Python,Json,Parsing,我的项目目前正在接收python中的JSON消息,我需要从中获取一些信息。为此,我们将其设置为字符串形式的简单JSON: jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}' 到目前为止,我一直在使用一个列表生成JSON请求,然后使用JSON.dumps,但要做相反的事情,我想我需要使用JSON.loads。然而,我在这方面运气不太好。有谁能给我提供一个片段,在上面的示例中,它将返回“2”,并输入“2”。非常简单: import json

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

jsonStr = '{"one" : "1", "two" : "2", "three" : "3"}'
到目前为止,我一直在使用一个列表生成JSON请求,然后使用
JSON.dumps
,但要做相反的事情,我想我需要使用
JSON.loads
。然而,我在这方面运气不太好。有谁能给我提供一个片段,在上面的示例中,它将返回
“2”
,并输入
“2”

非常简单:

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

有时json不是字符串。例如,如果您从如下url获取json:

j = urllib2.urlopen('http://site.com/data.json')
您需要使用json.load,而不是json.load:

j_obj = json.load(j)

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

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


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

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)时):


可以使用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

另外,看看您是否需要更好的性能。最近的版本提供了极大地改进读写的优化。实际上我已经在使用simplejson:
将simplejson导入为json
。忘了提了,但谢谢:)明白了。正在使用
.load
方法而不是
.loads
只是为了添加一点,即您可以通过调用j.read()获得字符串内容,然后使用loads方法。无论如何,在这种情况下,load()方法负责调用.read()注意:对于那些带有使用
单引号字符串分隔符的数据的函数,您可能意外地为Python字典创建了字符串表示。JSON将始终使用
分隔符。如果是这样,请修复生成该输出的代码,以使用
JSON.dumps()
而不是
str()
repr()
,然后前往了解如何恢复Python数据。您有Python文字的其他线索?查找
None
True
False
,JSON将使用
null
True
False
。那些没有jsonStr但有字典列表的人(可能使用
单引号字符串分隔符),也可以看看这里:您不能对JSON使用
ast.literal\u eval()
函数,因为除了简单的文本和整数示例之外,您只会遇到问题。JSON不是Python。只是因为可以使用
ast.literal\u eval()解析某些JSON
不能使这成为一种正确的方法。例如,您不能使用
ast.literal\u eval()解析
r'{“foo”:null,“bar”:true,“baz”:“\ud83e\udd26”}”
,因为它包含空值、一个布尔值和一个非BMP代码点。JSON表示这些值的方式不同于Python文本表示这些值的方式。
JSON.loads()
另一方面,该输入没有问题,并正确地将其解码为
{foo':None,'bar':True,'baz':'Next,
ast.literal\u eval()
的速度要慢一些,无法定制。您不应该使用它来解码JSON。
{
    "pk": 1, 
    "fb": {
        "new_key": "cc.ee was present!", 
        "fd_id": "12345", 
        "fc": ""
    }, 
    "fa": "cc.ee"
}
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