java - 迭代所有 json 对象并替换值

标签 java json iterator

我有以下 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;
}

检查它是否是一个有效的 JSON 对象

public boolean isJSONValid(String test) {
    try {
        new JSONObject(test);
    } catch (JSONException ex) {
        // edited, to include @Arthur's comment
        // e.g. in case JSONArray is valid as well...
        try {
            new JSONArray(test);
        } catch (JSONException ex1) {
            return false;
        }
    }
    return true;
}

最佳答案

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

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

现在您正在第二次调用 mapfillData,并创建另一个 Map。这次您找到attributes并第三次调用mapfillData。在第三次调用中,您会找到一些变量,并在将值写入 Map 时替换它们。在函数结束时,您返回 Map,但调用者(mapfillData 的第二次调用)不会对返回的 Map 执行任何操作code>,并且您的所有数据都会丢失。

我愿意:

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

关于java - 迭代所有 json 对象并替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59273127/

相关文章:

java - 在两个调试 session 之间保留对象 ID

java - docker 容器内的 Spring 启动抛出 java.net.ConnectException : Connection refused (Connection refused)

javascript - JSON 特定实体到 JavaScript 数组

mysql - 从 JSON 数据类型中提取 ISO 日期

c# - 简化在 Java 中编写自定义迭代器

java - 创建自定义方法安全表达式的最佳方法

java - 删除黑名单/禁止用户的请求

python - 如何使用 itertools.groupby 格式化字典列表?

c++ - 如何测试迭代器值是否具有整数类型?

c++ - 最终迭代器递减的应用及其含义