在较小的json文件中拆分json

时间:2018-04-12 23:48:50

标签: python json api parsing split

我在较小的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;"
}
 }]}}    

2 个答案:

答案 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设置为widgetsv设置为小部件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():

但是,我并不了解这些标准或图书馆;你必须做自己的研究,选择一个适合你的研究。