我在较小的json文件中解析json文件时遇到问题,到目前为止这是代码......
import json
import pathlib
from pprint import pprint
import xmltodict
from yattag import indent
pathlib.Path('x:/xx/xx/AppData/Local/Programs/Python/Python36-32/example').mkdir(parents=True, exist_ok=True)
with open("text.xml", 'rb') as f:
xmlString = f.read()
jsonString = json.dumps(xmltodict.parse(xmlString), indent=4)
with open("x:/xxxx/xx/AppData/Local/Programs/Python/Python36-32/example/data.json", 'w') as f:
f.write(jsonString)
a = json.load(open('x:/xxxx/xx/AppData/Local/Programs/Python/Python36-32/example/data.json'))
for k, v in a.items():
with open("x:/xxxx/xx/AppData/Local/Programs/Python/Python36-32/example/" + k + ".json", "w",
encoding='utf-16') as p:
p.write('{"%s" : "%s"}' % (k, v))
原始的json文件是从xml格式转换的,然后我的想法是根据数据将json文件拆分成几个较小的json文件,但它只创建了一个json文件“widgets”,它包含所有的json,我想要知道是否有任何方法来修改它并使用“小部件”类(“文本”,“图像”,“窗口”)的内容创建多个json文件。我正在使用python 3.x.我会提供任何帮助:/
这是json文件:
{"widgets":{
"widget": [ {
"debug": "on",
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;"
}
}]}}
答案 0 :(得分:0)
您可以使用Json库将json文件作为数据帧读取,这将使您的生活更轻松。然后你可以使用转储创建自己的jsons。
答案 1 :(得分:0)
您的顶级JSON dict有一个键值对widgets
,它本身就是一个带有单个键值对的widget
的dict,它是一个包含单个对象的列表,最后,它包含你真正想要的对象。
如果您打印出来,这会更容易看到:
{
"widgets": {
"widget": [
{
"debug": "on",
"window": {
"title": "Sample Konfabulator Widget",
"name": "main_window",
"width": 500,
"height": 500
},
"image": {
"src": "Images\/Sun.png",
"name": "sun1",
"hOffset": 250,
"vOffset": 250,
"alignment": "center"
},
"text": {
"data": "Click Here",
"size": 36,
"style": "bold",
"name": "text1",
"hOffset": 250,
"vOffset": 100,
"alignment": "center",
"onMouseUp": "sun1.opacity = (sun1.opacity \/ 100) * 90;"
}
}
]
}
}
所以,显然,迭代for k, v in a.items():
只循环一次,k
设置为widgets
,v
设置为小部件dict。
如果要循环遍历该列表的所有元素,则需要明确地执行此操作:
for k, v in a['widgets']['widget'][0].items():
或者,有一些标准用于以更直接的方式搜索JSON(JSONPath,一个我忘记名称的简单,一个基于CSS选择器,Apple的KVC,...),以及所有人的库他们在PyPI上。其中一个库可以让你做类似的事情:
for k, v in jsonsearch(a, 'widgets/widget/0/*').items():
...如果您稍后在列表中找到包含多个内容的示例,则可以将其简单地更改为:
for k, v in jsonsearch(a, 'widgets/widget/*/*').items():
但是,我并不了解这些标准或图书馆;你必须做自己的研究,选择一个适合你的研究。