迭代所有json对象并替换值

时间:2019-12-10 18:10:20

标签: java json iterator

我有以下JSON:

props: {
  projectElement: {
    type: Object,
    required: true
  }
},

我必须遍历json对象,并将变量的值替换为{ "data":{ "attributes":{ "external-event-url":"http://example.com", "is-sponsors-enabled":"true", "is-ticketing-enabled":"true", "timezone":"UTC", "name":"${name_variable}", "ends-at":"2020-01-02T23:59:59.123456+00:00", "starts-at":"2020-01-01T23:59:59.123456+00:00" }, "type":"event" } } ,例如${ 并且新的json应该采用相同的格式(带有变量${name_variable}的替换值)

如何迭代这种复杂的Json对象并替换变量中的值

我尝试了以下代码,但未按预期工作:

${}

检查其是否为有效的JSON对象

public Map<String, String> mapfillData(String jsonstr) {
    Map<String, String> map = new HashMap<String, String>();
    try {
        JSONObject jsonObject = new JSONObject(jsonstr);
        String[] keys = JSONObject.getNames(jsonObject);

        for (String key : keys) {
            try {
                if (jsonObject.get(key).toString().startsWith("${")) {
                    map.put(key, System.getProperty(jsonObject.get(key).toString()
                            .replace("${", "").replace("}", "")));
                } else {
                    if(isJSONValid(jsonObject.get(key).toString())){
                        mapfillData(jsonObject.get(key).toString());
                    }else{
                        map.put(key, jsonObject.get(key).toString());
                    }
                }

            } catch (Exception e) {

            }
        }
    } catch (JSONException e) {
        System.err.printf(jsonstr + " is not valid Json", e);
    }
    return map;
}

2 个答案:

答案 0 :(得分:1)

您的问题是,当您尝试递归处理JSON时,在每个递归级别上,您都在处理不同 JSON文档并将数据写入到不同 Map

您的函数接受一个字符串,然后将其解析为JSONObject。您创建一个Map来保存一些数据。第一次通过mapfillData时,您只会找到一个密钥data。然后,假设您的if逻辑正常工作(我没有尝试运行它),您将把data的内容呈现为另一个字符串并递归调用mapfillData

现在,您正在第二次致电mapfillData,并创建另一个Map。这次您找到attributes,然后再次致电mapfillData。在第三次调用中,您发现了一些变量,并将这些值写入Map时将其替换。在函数末尾,您返回Map,但是调用者(第二次调用mapfillData)对返回的Map无效,并且所有数据都丢失了

我会

  • 解析一次JSON,然后遍历JSONObject结构。换句话说,递归函数应该使用JSONObject。
  • 只需就地替换JSON元素。
  • 或者,如果您想展平元素并将它们收集到Map中,则可以预先实例化Map并将其传递给递归函数。

答案 1 :(得分:0)

要更轻松地进行转换,可以使用Jackson lib来完成一些困难的工作:

autoSort

然后用一点reflection来动态处理任何JSON对象字段:

ObjectMapper mapper = new ObjectMapper();
String jsonString = "{  
   "data":{  
      "attributes":{  
         "external-event-url":"http://example.com",
         "is-sponsors-enabled":"true",
         "is-ticketing-enabled":"true",
         "timezone":"UTC",
         "name":"${name_variable}",
         "ends-at":"2020-01-02T23:59:59.123456+00:00",
         "starts-at":"2020-01-01T23:59:59.123456+00:00"
      },
      "type":"event"
   }
}";

// considering JSONObject matches the Json object structure
JSONObject jsonObject = mapper.readValue(jsonString , JSONObject.class); 
相关问题