Я новичок в json, пытаюсь проанализировать два элемента (несколько вхождений), я почти уверен, что выполняю неправильную итерацию.
Мой json-файл:
{
"data": {
"chapter": {
"bibleId": "9f3cb709f9bded60-01",
"bookId": "PSA",
"id": "PSA.117",
"content": [
{
"type": "paragraph",
"style": "nb",
"content": [
{
"type": "verse-number",
"style": "v",
"verseId": "PSA.117.1",
"verseOrgId": [
"PSA.117.1"
],
"content": "1"
},
{
"type": "verse-text",
"verseId": "PSA.117.1",
"verseOrgId": [
"PSA.117.1"
],
"verseText": "Sed ut perspiciatis unde omnis iste natus."
},
{
"type": "verse-number",
"style": "v",
"verseId": "PSA.117.2",
"verseOrgId": [
"PSA.117.2"
],
"content": "2"
},
{
"type": "verse-text",
"verseId": "PSA.117.2",
"verseOrgId": [
"PSA.117.2"
],
"verseText": "Lorem ipsum dolor sit amet."
}
]
}
],
"number": "117",
"next": {
"id": "PSA.118",
"bookId": "PSA",
"number": "118"
},
"previous": {
"id": "PSA.116",
"bookId": "PSA",
"number": "116"
},
"copyright": "1969/77 Deutsche Bibelgesellschaft, Stuttgart",
"verseCount": 2,
"title": "Psalmi 117"
},
"studyContent": null,
"chapterImage": null
}
}
Желаемый результат:
PSA.117.1 Sed ut perspiciatis unde omnis iste natus.
PSA.117.2 Lorem ipsum dolor sit amet.
Мой результат:
PSA.117.1 Sed ut perspiciatis unde omnis iste natus.
Мой код:
import json
with open('data.json') as f:
data = json.load(f)
for i, verse in enumerate(data['data']['chapter']['content']):
if i == 0:
print("%s\t%s" % (verse['content'][0]['verseId'], verse['content'][1]['verseText']))
elif i == 1:
print("%s\t%s" % (verse['content'][0]['verseId'], verse['content'][1]['verseText']))






Проблема в вашем скрипте заключается в том, как вы перебираете структуру JSON и получаете доступ к данным стиха.
Предоставленная вами структура JSON содержит содержимое массива внутри data['data']['chapter']['content'], которое содержит только один элемент (абзац), а затем внутри этого абзаца есть содержимое массива. содержащий стихи.
import json
# Load the JSON data
with open('data.json') as f:
data = json.load(f)
# Get the verses from the JSON structure
verses = data['data']['chapter']['content'][0]['content']
# Initialize variables for storing verse number and text
verse_number = None
verse_text = None
# Iterate through the verse data
for item in verses:
if item['type'] == 'verse-number':
verse_number = item['verseId']
elif item['type'] == 'verse-text':
verse_text = item['verseText']
if verse_number is not None:
print("%s\t%s" % (verse_number, verse_text))
verse_number = None # Reset verse number for the next verse
Поскольку узлы verse-text также содержат verseId, я не вижу причин вообще обращать внимание на узлы verse-number, что только усложняет задачу.
Вам нужен еще один цикл по внутреннему списку content и отфильтровать узлы, входящие в typeverse-text:
for chapter in data['data']['chapter']['content']:
for verse in chapter['content']:
if verse['type'] == 'verse-text':
print(verse['verseId'], verse['verseText'], sep='\t')
Этот делает свою работу. Код @mitsuaaki был в порядке, но при примерно 31 строке он выдал 5 результатов.
Вероятно, потому, что он также только что посмотрел на один жестко запрограммированный ['content'][0]. Эмпирическое правило: для каждого списка ([]) нужен один for .. in.
a = data['data']['chapter']['content'][0]['content']
for i, verse in enumerate(a):
if i == 1:
print("%s\t%s" % (verse['verseId'], verse['verseText']))
elif i == 3:
print("%s\t%s" % (verse['verseId'],verse['verseText']))
Обратите внимание, что вы делаете одно и то же в обеих ветвях
if..else, делаяif..elseлишним, делаяiпеременной лишней,enumerateделая лишней.