Как разделить документ JSON? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть файл JSON, который включает в себя много документов.Каждый документ представляет собой данные из одного заказа на поставку.Я получаю файл из веб-службы в облачной системе заказов на покупку.Мне нужно загрузить каждый из этих документов в отдельную запись в базе данных Oracle.Я сделал это для других файлов документов JSON, используя функцию внешних таблиц Oracle, и это сработало.Тем не менее, другие файлы имели CRLF между каждым документом JSON.Файл, который я получаю от веб-службы, представляет собой один документ со многими заказами на поставку, без различий между заказами на покупку.

Я нашел здесь вопросы и ответы: Как разбить json на несколько файлов на документ ,Код, показанный в качестве решения:

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 голосов
/ 15 февраля 2019

Я думаю, что это будет делать то, что вы хотите.Возвращаемая json_obj_list форма json.load() на самом деле представляет собой словарь Python, поэтому вам нужно перебрать значения в json_obj_list['data'].Чтобы сохранить разумность кода в отношении существующих имен переменных, я изменил его, чтобы просто получать список объектов JSON непосредственно из словаря, возвращенного из json.load(), например:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...