Я изо всех сил пытаюсь заставить свой код 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"}]}]
Мои основные проблемы: я не могу вывести файл на:
Может ли кто-нибудь помочь мне, пожалуйста, и, пожалуйста, извините меня, я нуб?
NB. Чтобы обойти это, я создал отдельный скрипт, который печатал правильную вложенность и форматирование, но мне пришлось нелегко, и мне сказали использовать библиотеку, я знаю, что у библиотеки есть ограничения, и не уверен, что это одно из них .
Кроме того, я бы переименовал вашу переменную datetime в dt, чтобы вы не получали ошибок str obj has no attribute при последующих обращениях к этому модулю.
Откуда берутся все значения для json? Это может помочь построить более надежное решение
Спасибо, я исправил свой образец JSON и dt, я создаю значения самостоятельно, используя фейкер для генерации тестовых данных, так как я собираюсь проводить массовое тестирование по мере необходимости в файлах JSON.






Взгляните на фрагмент кода ниже
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 что у тебя в строке 12? Не могли бы вы дать мне фрагмент?
Я использую точно такой же код и строку «attributesTwo»: 24
@ ra67052 Я отредактировал это. Пожалуйста, проверьте, работает ли это сейчас для вас
Круто, спасибо, теперь работает, это очень помогло, и вы нашли мне ответ :)
Ваш образец json нуждается в быстром редактировании, он должен быть
"ID",, а не"ID,". Также обратите внимание, что[datas]— этоlist, а неdict.