如何拆分JSON文档?

时间:2019-02-15 15:36:24

标签: python json oracle

我有一个包含许多文档的JSON文件。每个文档都是来自一个采购订单的数据。我从云采购订单系统上的Web服务获取文件。我需要将每个文档加载到Oracle数据库的单独记录中。我已经使用Oracle的外部表功能对JSON文档的其他文件进行了此操作,并且它已经起作用。但是,其他文件在每个JSON文档之间都有一个crlf。我从Web服务获得的文件是一个文档,其中包含许多采购订单,采购订单之间没有信用。

我在这里找到了问与答:How to split json into multiple files per document。显示为解决方案的代码是

import json
in_file_path='path/to/file.json' # Change me!
with open(in_file_path,'r') as in_json_file:
    # Read the file and convert it to a dictionary
    json_obj_list = json.load(in_json_file)
    for json_obj in json_obj_list:
        filename=json_obj['_id']+'.json'
        with open(filename, 'w') as out_json_file:
            # Save each obj to their respective filepath
            # with pretty formatting thanks to `indent=4`
            json.dump(json_obj, out_json_file, indent=4)

但是当我尝试解决方案时,出现如下错误:

[oracle@localhost gk]$ python36 split.py
Traceback (most recent call last):
  File "split.py", line 11, in <module>
    filename=json_obj['_id']+'.json'
TypeError: string indices must be integers

我的JSON文件如下:

{
    "data": [
        {
            "number": "PB510698",
            "uuid": "9cc06f21c1194038b137cec51b02606b"
        },

        etc ...

    ]
}

有多个以{"number":"PB510698","uuid"开头的文档(子文档?)

有什么想法为什么其他帖子中的代码不起作用?

1 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求。从json_obj_list返回的json.load()实际上是Python字典,因此您需要对其json_obj_list['data']中的值进行迭代。为了使代码对现有变量名称敏感,我对其进行了修改,使其仅从json.load()返回的字典中直接检索JSON对象列表,如下所示:

json_obj_list = json.load(in_json_file)['data']

这是完整的代码:

import json


in_file_path = 'testfile.json'

with open(in_file_path,'r') as in_json_file:

    # Read the file and get the list from the dictionary.
    json_obj_list = json.load(in_json_file)['data']

    for json_obj in json_obj_list:
        filename = json_obj['number']+'.json'  # Changed this, too, per comment by OP.
        print('creating file:', filename)
        with open(filename, 'w') as out_json_file:
            # Save each obj to their respective filepath
            # with pretty formatting thanks to `indent=4`
            json.dump(json_obj, out_json_file, indent=4)