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