我有一个包含许多文档的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"
开头的文档(子文档?)
有什么想法为什么其他帖子中的代码不起作用?
答案 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)