【问题标题】:How to parse this JSON in APEX?如何在 APEX 中解析这个 JSON?
【发布时间】:2020-03-07 14:30:19
【问题描述】:

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

    }

}

【问题讨论】:

  • 我不熟悉 Salesforce,但值得为此添加语言标签吗?

标签: json salesforce apex


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-29
    • 2017-06-07
    • 2014-04-16
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多