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