Как получить доступ к вложенным JSON в Apex? - PullRequest
0 голосов
/ 13 марта 2020

Я новичок в Apex, и я был бы признателен за помощь в следующем:

Код ниже возвращает весь список из ввода:

public static string input ='[{"item1": 1,"item2": "2","item3": [{"child1": "11","child2": "22","child3": 33}]},{"item1": "aa","item2": "bb","item3": [{"child1": "22","child2": "33","child3": 12}]}]';

List<Object> jsonParsed = (List<Object>) JSON.deserializeUntyped(input);
System.debug(jsonParsed);

, и я хочу получить дочерний элемент "item3", так что я могу читать:

"item1": "1" "child1": "11" "child2": "22" "child3": 33

Я безуспешно пробовал приведенный ниже код, и я получаю item1, но ноль для детей 1,2 и 3.

for(Object jsonParsed : jsonParsed){
        Map<String,Object> ind = (Map<String,Object> )jsonParsed;
        System.debug('item1 = '+ ind.get('item1'));        
        System.debug('child1 = '+ ind.get('item3.child1[0]'));
        System.debug('child2 = '+ ind.get('item3.child2[1]'));
        System.debug('child3 = '+ ind.get('item3.child3[2]'));
    }

1 Ответ

1 голос
/ 14 марта 2020

Apex не поддерживает пути отношений или выражения в методе get() следующим образом:

    System.debug('child1 = '+ ind.get('item3.child1[0]'));

Это просто вернет null.

Вы должны получить доступ к каждому уровню структуры в последовательности JSON, и если вы используете deserializeUntyped(), вы также должны приводить структуры данных на каждом уровне (поскольку get() возвращает обобщенный c тип Object):

    Map<String, Object> item3 = (Map<String, Object>)ind.get('item3');
    List<Object> child1 = (Map<String, Object>)item3.get('child1');
    Object child1Item = child1[0];

    System.debug('child1 = ' + child1Item);

Обычно, где это возможно, гораздо проще определить строго типизированный класс Apex, представляющий ваш JSON, и десериализовать в него. Ваш JSON достаточно обобщенный c, поэтому я не вижу, как это сделать; вам нужно взглянуть на фактические типы данных и ключи и рассмотреть возможность использования такого инструмента, как JSON2Apex .

...