2016-06-15 3 views
3

У меня есть файл JSON, который мне нужно разобрать, чтобы извлечь некоторые значения.Разбор JSON с использованием Delphi 7

образец выглядит следующим образом:

[ 
    { 
    "period": "2016-06-07 - 2016-06-14", 
    "range": "2016-06-07..2016-06-14", 
    "items": [ 
     { 
     "region_name": "Canterbury/Otago", 
     "region_id": 12, 
     "average_cover": 2099, 
     "average_growth": 16, 
     "reading_count": 3 
     }, 
     { 
     "region_name": "Southland", 
     "region_id": 14, 
     "average_cover": 2068, 
     "average_growth": 3, 
     "reading_count": 1 
     }, 
     { 
     "region_name": "Wairarapa \u0026 Hawkes Bay", 
     "region_id": 10, 
     "average_cover": 2195, 
     "average_growth": 20, 
     "reading_count": 2 
     } 
    ] 
    }, 
    { 
    "period": "2016-05-31 - 2016-06-07", 
    "range": "2016-05-31..2016-06-07", 
    "items": [ 
     { 
     "region_name": "Canterbury/Otago", 
     "region_id": 12, 
     "average_cover": 2126, 
     "average_growth": 17, 
     "reading_count": 5 
     }, 
     { 
     "region_name": "Southland", 
     "region_id": 14, 
     "average_cover": 2181, 
     "average_growth": 10, 
     "reading_count": 2 
     } 
    ] 
    }, 
    { 
    "period": "2016-05-24 - 2016-05-31", 
    "range": "2016-05-24..2016-05-31", 
    "items": [ 
     { 
     "region_name": "Canterbury/Otago", 
     "region_id": 12, 
     "average_cover": 2139, 
     "average_growth": 28, 
     "reading_count": 6 
     }, 
     { 
     "region_name": "Central Plateau", 
     "region_id": 6, 
     "average_cover": 2400, 
     "average_growth": 38, 
     "reading_count": 1 
     }, 
     { 
     "region_name": "Wairarapa \u0026 Hawkes Bay", 
     "region_id": 10, 
     "average_cover": 2254, 
     "average_growth": 27, 
     "reading_count": 2 
     } 
    ] 
    }, 
    { 
    "period": "2016-05-18 - 2016-05-25", 
    "range": "2016-05-18..2016-05-25", 
    "items": [ 
     { 
     "region_name": "Canterbury/Otago", 
     "region_id": 12, 
     "average_cover": 2183, 
     "average_growth": 39, 
     "reading_count": 6 
     }, 
     { 
     "region_name": "Manawatu", 
     "region_id": 9, 
     "average_cover": 2315, 
     "average_growth": 42, 
     "reading_count": 1 
     }, 
     { 
     "region_name": "Wairarapa \u0026 Hawkes Bay", 
     "region_id": 10, 
     "average_cover": 2228, 
     "average_growth": 29, 
     "reading_count": 2 
     } 
    ] 
    }, 
    { 
    "period": "2016-05-10 - 2016-05-17", 
    "range": "2016-05-10..2016-05-17", 
    "items": [ 
     { 
     "region_name": "Canterbury/Otago", 
     "region_id": 12, 
     "average_cover": 2251, 
     "average_growth": 40, 
     "reading_count": 8 
     }, 
     { 
     "region_name": "Otago", 
     "region_id": 13, 
     "average_cover": 2595, 
     "average_growth": 26, 
     "reading_count": 1 
     }, 
     { 
     "region_name": "Southland", 
     "region_id": 14, 
     "average_cover": 2526, 
     "average_growth": 49, 
     "reading_count": 2 
     }, 
     { 
     "region_name": "Waikato", 
     "region_id": 4, 
     "average_cover": 2484, 
     "average_growth": 60, 
     "reading_count": 1 
     }, 
     { 
     "region_name": "Wairarapa \u0026 Hawkes Bay", 
     "region_id": 10, 
     "average_cover": 2201, 
     "average_growth": 34, 
     "reading_count": 2 
     } 
    ] 
    } 
] 

Элементов Я ищу экстракт region_id, average_cover и average_growth.

Я удался извлечь значения из первого items массива, но мой файл JSON образца содержит 4 items массивов, и я могу только показаться, чтобы извлечь значения из первого items элемента.

Я использую ulkJSON.pas библиотеку и мой Delphi код выглядит следующим образом, чтобы отправить значения в TMemo на форме:

var 
    js: TlkJSONBase; 
    Items: TlkJSONbase; 
    I: Integer; 
    lHTTP: TIdHTTP; 
    sJSON: String;  
begin 
    sJSON := // as per sample JSON text in question 
    js := TlkJSON.ParseText(sJSON); 
    Items := js.Field['items']; 
    for I := 0 to Pred(Items.Count) do begin 
    Memo1.Lines.Add(VarToStr(Items.Child[I].Field['region_id'].Value)); 
    Memo1.Lines.Add(VarToStr(Items.Child[I].Field['average_cover'].Value)); 
    Memo1.Lines.Add(VarToStr(Items.Child[I].Field['average_growth'].Value)); 
    end; 
end; 
+0

Я пробовал форматировать ваш код JSON для вас, но, по-видимому, он недействителен JSON. ** РЕДАКТИРОВАТЬ ** На самом деле вы забыли включить скобки для открытия/закрытия массива ('[]'). Однако даже в этом случае я не вижу, как вы можете читать объект 'items' так, как написано ваш код. –

+0

Я переформатировал JSON, чтобы сделать массивы немного яснее. Но да, код не соответствует показанному JSON. –

ответ

1

Вы не нашли массив верхнего уровня во внимание. Этот код работает для показанного JSON:

var 
    sJSON: String;  
    js, Items, Item: TlkJSONBase; 
    I, J: Integer; 
begin 
    sJSON := // as per sample JSON text in question 
    js := TlkJSON.ParseText(sJSON); 
    for I := 0 to Pred(js.Count) do 
    begin 
    Items := js.Child[I].Field['items']; 
    for J := 0 to Pred(Items.Count) do begin 
     Item := Items.Child[J]; 
     Memo1.Lines.Add(VarToStr(Item.Field['region_id'].Value)); 
     Memo1.Lines.Add(VarToStr(Item.Field['average_cover'].Value)); 
     Memo1.Lines.Add(VarToStr(Item.Field['average_growth'].Value)); 
    end; 
    end; 
end; 
+0

Отлично. Работала отлично. Также ошибка с моим исходным текстом образца JSON. Очень признателен. – DaveMc

Смежные вопросы