为什么可以';Python解析这个JSON数据吗?
我将此JSON保存在一个文件中:为什么可以';Python解析这个JSON数据吗?,python,json,parsing,Python,Json,Parsing,我将此JSON保存在一个文件中: { “地图”:[ { “id”:“blabla”, “iscategorical”:“0” }, { “id”:“blabla”, “iscategorical”:“0” } ], “面具”:[ “id”:“valore” ], “om_点数”:“值”, “参数”:[ “id”:“valore” ] } 我编写此脚本是为了打印所有JSON数据: import json from pprint import pprint with open('data.jso
{
“地图”:[
{
“id”:“blabla”,
“iscategorical”:“0”
},
{
“id”:“blabla”,
“iscategorical”:“0”
}
],
“面具”:[
“id”:“valore”
],
“om_点数”:“值”,
“参数”:[
“id”:“valore”
]
}
我编写此脚本是为了打印所有JSON数据:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
但是,此程序引发了一个异常:
回溯(最近一次呼叫最后一次):
文件“”,第5行,在
data=json.load(f)
文件“/usr/lib/python3.5/json/_init__.py”,第319行,加载
返回\u默认\u解码器。解码
文件“/usr/lib/python3.5/json/decoder.py”,第339行,在decode中
obj,end=self.raw\u decode(s,idx=\u w(s,0.end())
原始解码中的文件“/usr/lib/python3.5/json/decoder.py”,第355行
obj,end=self.scan_一次(s,idx)
json.decoder.JSONDecodeError:应为','分隔符:第13行第13列(字符213)
如何解析JSON并提取其值?您的数据格式无效。当您应该有{}
时,您有[]
:
用于JSON数组,在Python中称为[]
list
用于JSON对象,在Python中称为{}
dict
{
“地图”:[
{
“id”:“blabla”,
“iscategorical”:“0”
},
{
“id”:“blabla”,
“iscategorical”:“0”
}
],
“面具”:{
“id”:“valore”
},
“om_点数”:“值”,
“参数”:{
“id”:“valore”
}
}
然后您可以使用您的代码:
导入json
从pprint导入pprint
将open('data.json')作为f:
data=json.load(f)
pprint(数据)
使用数据,您现在还可以找到如下值:
data[“maps”][0][“id”]
数据[“掩码”][“id”]
数据[“om_点”]
试试这些,看看它是否有意义。您的
数据。json
应该如下所示:
{
"maps":[
{"id":"blabla","iscategorical":"0"},
{"id":"blabla","iscategorical":"0"}
],
"masks":
{"id":"valore"},
"om_points":"value",
"parameters":
{"id":"valore"}
}
data["maps"][0]["id"] # will return 'blabla'
data["masks"]["id"] # will return 'valore'
data["om_points"] # will return 'value'
with open('data.json', encoding='utf-8') as data_file:
data = json.loads(data_file.read())
您的代码应该是:
import json
from pprint import pprint
with open('data.json') as data_file:
data = json.load(data_file)
pprint(data)
请注意,这仅适用于Python2.6及更高版本,因为它取决于。在Python2.5中,使用带有u语句的uu future uuu导入的,在Python中,“Ultra JSON”或简单的“ujson”可以处理JSON文件输入中的[]
。如果您正在将JSON输入文件作为JSON元素列表读取到程序中;例如,[{{}]},{},[]等..]
ujson可以处理任意顺序的字典列表,字典列表
您可以在中找到ujson,并且API几乎与Python内置的json
库相同
如果加载更大的JSON文件,ujson也会更快。在提供的同一链接中,您可以看到与其他Python JSON库相比的性能详细信息。非常有用,但是如果您使用Python 3,读取JSON应该这样做:
{
"maps":[
{"id":"blabla","iscategorical":"0"},
{"id":"blabla","iscategorical":"0"}
],
"masks":
{"id":"valore"},
"om_points":"value",
"parameters":
{"id":"valore"}
}
data["maps"][0]["id"] # will return 'blabla'
data["masks"]["id"] # will return 'valore'
data["om_points"] # will return 'value'
with open('data.json', encoding='utf-8') as data_file:
data = json.loads(data_file.read())
注意:使用json.load
而不是json.load
。在Python3中,json.loads
接受一个字符串参数json.load
采用类似文件的对象参数data\u file.read()
返回字符串对象
老实说,我不认为在大多数情况下将所有json数据加载到内存中是一个问题。
我在JS、Java、Kotlin、cpp和我使用的几乎所有语言中都看到了这一点。
把记忆问题当作一个笑话给我听:< /P>
另一方面,我认为如果不阅读所有内容,就无法解析json。如果您使用的是Python3,您可以尝试将(connection.json
文件)json更改为:
然后使用以下代码:
connection_file = open('connection.json', 'r')
conn_string = json.load(connection_file)
conn_string['connection1']['connection_string_python'])
connection_file.close()
>>> test1
下面是修改后的data.json
文件:
{
“地图”:[
{
“id”:“blabla”,
“iscategorical”:“0”
},
{
“id”:“blabla”,
“iscategorical”:“0”
}
],
“面具”:[{
“id”:“valore”
}],
“om_点数”:“值”,
“参数”:[{
“id”:“valore”
}]
}
您可以使用以下行在控制台上调用或打印数据:
导入json
从pprint导入pprint
将open('data.json')作为数据文件:
data\u item=json.load(数据文件)
pprint(数据项)
打印的预期输出(数据项['parameters'][0]['id'])
:
打印的预期输出(数据项['parameters'][0]['id'])
:
此解析中有两种类型
从系统路径解析文件中的数据
从远程URL解析JSON
从文件中,可以使用以下命令
import json
json = json.loads(open('/path/to/file.json').read())
value = json['key']
print(json['value'])
本篇文章解释了使用两种场景的完整解析和获取值。作为python3用户
load
和load
方法之间的区别非常重要,尤其是当您从文件中读取json数据时
如文件所述:
json.load:
反序列化fp(a.read()-支持文本文件或二进制文件
包含JSON文档的文件)使用
转换表
json.load:
加载:反序列化s(str、bytes或bytearray实例
包含JSON文档)转换为Python对象
桌子
load方法可以直接读取打开的json文档,因为它可以读取二进制文件
with open('./recipes.json') as data:
all_recipes = json.load(data)
因此,您的json数据以根据此转换表指定的格式提供:
Ok,我必须控制我的代码,因为这个json文件是从java对象生成的。谢谢,谢谢你的解决方案。我在打印时得到了一个unicode符号。(如“瓦洛雷”)。如何防止它?不错,但是python在每个键之前添加了一个u'
。知道为什么吗?这就是为什么您的文本是unicode类型而不是字符串。大多数情况下,对于德语UMLAUT和与其他模块/程序共享文本结果等,最好使用unicode文本。那么你是g
with open('./recipes.json') as data:
all_recipes = json.load(data)