Вложение с библиотекой JSON в Python

Я изо всех сил пытаюсь заставить свой код Python работать, чтобы выводить правильное вложение и форматирование для моих сообщений JSON. Моя проблема в том, что я не могу вложить объекты в JSON так, как был задан образец JSON, поскольку исходная система примет его только так. Я читал документацию и другие учебные пособия и т. д. В Интернете, но ничего не нашел для решения этой проблемы.

Вот пример JSON, с которым мне приходится работать, и он содержит правильное форматирование:

    {"messageId": "ID,"messageType": "Type","createdDateTime": "2019-01-01T10:10:10Z","recordOne": [{"dataItemOne": "E123345","dataItemTwo": "2019-01-01T12:12:12Z","attributesRecord": {"attributesOne": 22,"attributesTwo": 24,},"recordTwo": {"dataItemOne": "L22","dataItemTwo": "EL","dataItemThree": "ADDFES334S",},"recordThree": [{"itemOne": "P44587"}]}]}

И вот мой код

import datetime
import json

datetime = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")

data = {'messageId': 'ID',
        'messageType': 'Type',
        'createdDateTime': datetime}

data1 = {'recordOne': []}

data1['recordOne'].append({
    'dataItemOne': 'E123345',
    'dataItemTwo': datetime,
})

datas = [data, data1]

with open('mata.json', 'w') as outfile:
    data = json.dumps(data)
    json.dump(datas, outfile)

Это дает мне этот тип JSON:

    [{"messageId": "ID","messageType": "Type","createdDateTime": "2019-03-14T20:31:55Z"}, {"recordOne": [{"dataItemOne": "E123345","dataItemTwo": "2019-03-14T20:31:55Z"}]}]

Мои основные проблемы: я не могу вывести файл на:

  • Начните с фигурных скобок, т.е. {"messageId": "ID", а не [{"messageId": "ID"
  • Я не могу настроить формат recordOne как «recordOne»: [{
  • Затем выводите attributeRecord как в recordOne как «attributesRecord»: {
  • Затем поля Nest под attributeRecords
  • Записи recordTwo и recordThree Я не могу создать более одного объекта

Может ли кто-нибудь помочь мне, пожалуйста, и, пожалуйста, извините меня, я нуб?

NB. Чтобы обойти это, я создал отдельный скрипт, который печатал правильную вложенность и форматирование, но мне пришлось нелегко, и мне сказали использовать библиотеку, я знаю, что у библиотеки есть ограничения, и не уверен, что это одно из них .

Ваш образец json нуждается в быстром редактировании, он должен быть "ID", , а не "ID," . Также обратите внимание, что [datas] — это list, а не dict.

C.Nivs 14.03.2019 21:59

Кроме того, я бы переименовал вашу переменную datetime в dt, чтобы вы не получали ошибок str obj has no attribute при последующих обращениях к этому модулю.

C.Nivs 14.03.2019 22:00

Откуда берутся все значения для json? Это может помочь построить более надежное решение

C.Nivs 14.03.2019 22:07

Спасибо, я исправил свой образец JSON и dt, я создаю значения самостоятельно, используя фейкер для генерации тестовых данных, так как я собираюсь проводить массовое тестирование по мере необходимости в файлах JSON.

ra67052 14.03.2019 23:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
4
106
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Взгляните на фрагмент кода ниже

import datetime
import json

dt = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")

data = {'messageId': 'ID',
        'messageType': 'Type',
        'createdDateTime': dt}

data['recordOne'] = [{
    'dataItemOne': 'E123345',
    'dataItemTwo': dt
}]

# since recordOne contains a list, we use [0] to paste stuff inside it
data['recordOne'][0]['attributesRecord'] = {
    'attributesOne': 22,
    'attributesTwo': 24
}

data['recordTwo'] = {
    ...
}

# and so on and so forth

with open('mata.json', 'w') as outfile:
    json.dump(data, outfile)

Главное, что нужно вынести из этого, это то, что если вы хотите добавить что-то в свой словарь, вы можете просто создать новый ключ, написав data['recordOne'] и data['recordOne'][0]['attributesRecord'], и при этом вы также можете присвоить ему нужные значения.

Если вы хотите сохранить вложенность, просто продолжайте добавлять уровни ключей. Имейте в виду, что если вы помещаете словари в списки, вам нужно будет получить доступ к парам ключ-значение внутри списка, используя их соответствующие индексы (например, [0])

Поскольку некоторые из ваших словарей также должны быть внутри списков, я бы добавил их как таковые (см. первый data['recordOne']).

И, наконец, json.dumps() используется для создания строк, а json.dump() — для записи в файл. Так что используйте это. Надеюсь, это помогло!

Спасибо за ваш быстрый ответ, то, что вы сказали, имеет смысл, и я попробовал код, но получил «строку 12, в <module>, 'attributeRecord': 0, TypeError: индексы списка должны быть целыми числами или фрагментами, а не str" ошибка, не знаю как решить?

ra67052 14.03.2019 22:59

@ ra67052 что у тебя в строке 12? Не могли бы вы дать мне фрагмент?

Sergey Ronin 14.03.2019 23:04

Я использую точно такой же код и строку «attributesTwo»: 24

ra67052 14.03.2019 23:07

@ ra67052 Я отредактировал это. Пожалуйста, проверьте, работает ли это сейчас для вас

Sergey Ronin 14.03.2019 23:17

Круто, спасибо, теперь работает, это очень помогло, и вы нашли мне ответ :)

ra67052 14.03.2019 23:23

Другие вопросы по теме