如何使用Apex_JSON解析键名动态变化的JSON对象
解决Apex JSON动态键取值的问题
完全懂你的困扰!当JSON里的键是动态变化的时候,固定路径的apex_json.get_varchar2确实没法直接用,得换个思路——先拿到这些动态键的列表,再逐个去遍历取值。下面给你两种实用的解决方法:
方法一:用Apex_JSON的键列表遍历
如果已经在用Apex_JSON来解析JSON,你可以先获取CHANGED VALUES对象下的所有动态键,然后拼接路径去取值:
String jsonString = '{ "CHANGED VALUES":{ "FNAME":{ "old":"fname_old", "new":"fname_new" }, "LNAME":{ "old":"lname_old", "new":"lname_new" } } }'; // 先解析JSON Apex_JSON.parse(jsonString); // 获取"CHANGED VALUES"下的所有动态字段名 List<String> changedFieldNames = Apex_JSON.get_keys('CHANGED VALUES'); // 遍历每个动态字段 for(String fieldName : changedFieldNames) { // 拼接old和new的路径 String oldValuePath = 'CHANGED VALUES.' + fieldName + '.old'; String newValuePath = 'CHANGED VALUES.' + fieldName + '.new'; // 获取对应的值 String oldValue = Apex_JSON.get_varchar2(oldValuePath); String newValue = Apex_JSON.get_varchar2(newValuePath); // 这里可以根据需求做后续处理,比如记录日志或者更新数据 System.debug('字段 ' + fieldName + ':旧值=' + oldValue + ',新值=' + newValue); }
方法二:转成Map<String, Object>处理
这种方法更灵活,不需要依赖Apex_JSON的解析状态,直接把JSON转成无类型的Map,然后逐层遍历:
String jsonString = '{ "CHANGED VALUES":{ "FNAME":{ "old":"fname_old", "new":"fname_new" }, "LNAME":{ "old":"lname_old", "new":"lname_new" } } }'; // 将JSON字符串反序列化为无类型Map Map<String, Object> rootMap = (Map<String, Object>)JSON.deserializeUntyped(jsonString); // 获取"CHANGED VALUES"对应的子Map Map<String, Object> changedValuesMap = (Map<String, Object>)rootMap.get('CHANGED VALUES'); // 遍历每个动态字段 for(String fieldName : changedValuesMap.keySet()) { // 获取当前字段的old/new值Map Map<String, Object> fieldChangeMap = (Map<String, Object>)changedValuesMap.get(fieldName); // 取出old和new值(注意类型转换,根据实际数据类型调整) String oldValue = (String)fieldChangeMap.get('old'); String newValue = (String)fieldChangeMap.get('new'); System.debug('字段 ' + fieldName + ':旧值=' + oldValue + ',新值=' + newValue); }
注意事项
- 如果
old或new的值不是字符串(比如数字、日期),记得把类型转换改成对应的类型,比如(Integer)、(Date)等。 - 可以根据你的业务场景选择合适的方法:如果已经在使用Apex_JSON做其他解析操作,方法一更顺手;如果需要更灵活的结构处理,方法二更合适。
内容的提问来源于stack exchange,提问作者user3167732
相关产品推荐
相关产品推荐

