2016-04-05 5 views
1

Я только начал использовать PL/JSON, и я могу разобрать данные без массива, такие как имя, например:Как использовать PL/JSON для синтаксического анализа массива данных

json_ext.get_string (json (l_list.get (i)), 'firstName'); 

Однако я не может понять, как анализировать данные массива, такие как адреса, например:

street1 := json_ext.get_string (json (l_list.get (i)), 'addresses.street1'); 

не работает.

Как я правильно анализировать массивы данных, используя:

street1 := json_ext.get_string (json (l_list.get (i)), 'addresses.street1'); 

, используя в качестве примера?

Вот пример JSON:

[ 
    { 

"firstName": "Edward", 
"middleName": "Wolfgang", 
"lastName": "Munster",  
"addresses": [ 
    {  
    "city": "", 
    "addressType": "home", 
    "state": "CA", 
    "street1": "1313 Mockingbird Lane", 
    "street2": "" 
    }, 
    {   
    "city": "", 
    "addressType": "business", 
    "state": "CA", 
    "street1": "123 Morgan Rd.", 
    "street2": "" 
    } 
], 
} 

Вот пример кода, который я использую:

BEGIN 
    SELECT json   
    INTO l_json 
    FROM json_table 
    WHERE id = 1; 
    EXCEPTION 
     WHEN NO_DATA_FOUND 
     THEN 
      l_json := NULL; 
    END; 


l_list := json_list (l_json); 

FOR i IN 1 .. l_list.COUNT 
LOOP 
--These parse correctly  
    firstname := json_ext.get_string (json (l_list.get (i)), 'firstName');   
    middlename := json_ext.get_string (json (l_list.get (i)), 'middleName'); 
    lastname := json_ext.get_string (json (l_list.get (i)), 'lastName');  

--These do not parse at all 
    addresstype := json_ext.get_string (json (l_list.get (i)), 'addresses.addressType');  
    street1 := json_ext.get_string (json (l_list.get (i)), 'addresses.street1'); 
    street2 := json_ext.get_string (json (l_list.get (i)), 'addresses.street2'); 
    city := json_ext.get_string (json (l_list.get (i)), 'addresses.city'); 
    state := json_ext.get_string (json (l_list.get (i)), 'addresses.state'); 
+0

Вы уже разбираете внешний массив. В чем заключается ваша сложность в анализе внутреннего массива? Это одно и то же действие. –

+0

@JamesSumners Для внутреннего массива данных не возвращаются. Похоже, json_ext.get_string (json (l_list.get (i)) не работает для вложенного внутреннего массива. – user6146386

+0

@JamesSumners Основываясь на моем предыдущем ответе, есть ли у вас какое-либо представление о том, что я делаю неправильно? – user6146386

ответ

0

Это довольно просто. Просто найдите список и повторите его:

-- { 
-- "foo": "bar", 
-- "list": [ 
--  {"key": "value"}, 
--  {"key": "value"} 
-- ] 
-- } 

declare 
    json_data json := '<the above JSON>'; 
    list_value json_list; 
begin 
    list_value := json_data.get('list'); 

    for i in 1 .. list_value.count 
    loop 
    dbms_output.put_line('key = ' || list_value[i].get('key')); -- "key = value" 
    end; 
end; 
/
0

Приведенный выше пример не подходит для меня. Мне удалось добиться следующих результатов.

declare 
    json_data2 json; 
    json_data json := json('{ "foo": "bar", "list": [  {"key": "value1"},  {"key": "value2"} ] }'); 
    list_value json_list; 
begin 
    list_value := pljson_ext.get_json_list(json_data, 'list'); 

    dbms_output.put_line('Count = '||list_value.count); 

    for i in 1 .. list_value.count 
    loop 
    -- json_data2 := json(list_value.get(i)); 
json(list_value.get(i)).get('key').print; 
    -- dbms_output.put_line('key = ' || json_data2.get('key')); -- "key = value" 
    -- json_data2.get('key').print; 
    end loop; 
end; 
/