Как разобрать эту JSON в APEX? - PullRequest
0 голосов
/ 07 марта 2020

С помощью приведенного ниже кода я могу получить доступ к переменным Name, Weight и Value, но не к переменной AdvisoryModel. Я думаю, это потому, что он находится вне узла AssetClassDistrib.

Как получить переменную AdvisoryModel?

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

public class FromJSON_V1 {
public static string input ='{"AdvisoryModel": "","AdvisoryModelName": "","AnalysisDate": "2017-09-01","AssetClassDistrib": [{"Code": "5917","Name": "Equities - Emerging Markets","Value": 278.79749999999956,"Weight": 0.284105297215223}]}';
    public static void parse(){

        Map<String,Object> jsonParsed =(Map<String,Object> ) JSON.deserializeUntyped(input);
         System.debug(jsonParsed);
        List<Object> entriesArray =( List<Object> ) jsonParsed.get('AssetClassDistrib');

        for(Object inidividualEntries : entriesArray){
            Map<String,Object> ind = (Map<String,Object> )inidividualEntries;
            System.debug('Id = '+ ind.get('AdvisoryModel'));
            System.debug('Id = '+ ind.get('Name'));
            System.debug('Id = '+ ind.get('Weight'));
            System.debug('Id = '+ ind.get('Value'));
        }

    }

}

1 Ответ

2 голосов
/ 07 марта 2020

Свойство "AdvisoryModel" не имеет значения, указанного в JSON. Кроме того, это не свойство объектов в массиве. Это свойство самого внешнего объекта.

Пожалуйста, попробуйте код ниже, и дайте мне знать, если вы видите ожидаемые результаты:

public class FromJSON_V1 {
    public static string input ='{"AdvisoryModel": "test","AdvisoryModelName": "","AnalysisDate": "2017-09-01","AssetClassDistrib": [{"Code": "5917","Name": "Equities - Emerging Markets","Value": 278.79749999999956,"Weight": 0.284105297215223}]}';
    public static void parse(){
        Map<String,Object> jsonParsed =(Map<String,Object> ) JSON.deserializeUntyped(input);
        System.debug(jsonParsed);
        List<Object> entriesArray =( List<Object> ) jsonParsed.get('AssetClassDistrib');
        System.debug('AdvisoryModel before loop =' + jsonParsed.get('AdvisoryModel'));
        for(Object inidividualEntries : entriesArray){
            Map<String,Object> ind = (Map<String,Object> )inidividualEntries;
            System.debug('AdvisoryModel = ' + jsonParsed.get('AdvisoryModel'));
            System.debug('Name = '+ ind.get('Name'));
            System.debug('Weight = '+ ind.get('Weight'));
            System.debug('Value = '+ ind.get('Value'));
        }  
    }
}

С такими сложными объектами, это может быть легче десериализовать в тип Apex вместо нетипизированной карты. Если вы не уверены, каким будет ответ в будущем, тогда карта - это хорошее решение. Если вы предполагаете, что всегда будет массив объектов с этими свойствами, это также может быть конкретный объект.

Если вы придерживаетесь карты, я бы предложил некоторую проверку типов, чтобы избежать запуска. ошибки времени, если свойство AssetClassDistrib по какой-либо причине не содержит массив.

    Object assetClassDistrib = jsonParsed.get('AssetClassDistrib');
    List<Object> entriesArray =  assetClassDistrib instanceof List<Object> ? 
        (List<Object>)jsonParsed.get('AssetClassDistrib') : 
        new List<Object>();
...