如何在 APEX 中解析这个 JSON?

How to parse this JSON in APEX?

使用下面的代码我可以访问变量 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'));
        }

    }

}

"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>();