【问题标题】:Split json in smaller json files将 json 拆分为较小的 json 文件
【发布时间】:2018-04-12 23:48:49
【问题描述】:

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

【问题讨论】:

  • 请修正你的缩进

标签: python json api parsing split


【解决方案1】:

您可以使用 Json 库将 json 文件作为数据框读取,这将使您的生活更轻松。然后,您可以使用转储创建自己的 json。

【讨论】:

  • 我忘了添加我的 json 文件:/ 抱歉,这是我的第一个问题
  • 别担心。我也是初学者。
  • 感谢反馈,我以后会考虑的
【解决方案2】:

您的顶级 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 设置为小部件字典。

如果你想遍历该列表的所有元素,你需要明确地这样做:

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

但是,我不知道这些标准或库中的任何一个;您必须自己进行研究才能选择适合您的。

【讨论】:

  • 非常感谢!我是 python 新手,这些信息将帮助我处理更大的文件,谢谢!
  • @lmx 你知道如何漂亮地打印 JSON 吗?您可以use Python to do it,也可以使用any of various websites。无论哪种方式,确保结构符合您的想法都非常有帮助。
  • 我实际上是在将一个较大的xml文件转换成一个json,然后想法是拆分那个json
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 2021-06-11
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多