【发布时间】:2023-03-20 09:33:01
【问题描述】:
我有以下 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 对象并替换变量中的值”,递归。如果它是一个 JSONObject 然后下降到它并迭代它的孩子如果孩子是一个 JSONObject 然后递归。
-
@xtratic,这就是我试图实现相同的逻辑。但不知道我在哪里犯了错误。
-
问问自己,只对整个 JSON 文本进行替换是否会更好。但如果您决定不这样做,那么最好先将 JSON 转换为对象,然后调用接受 JSONObject 而不是字符串的递归方法,并避免从字符串到对象的所有转换。
-
请发布您的所有代码。 isJSONValid() 是什么样的?
-
@StvnBrkdll,已更新。此方法用于检查特定键的值是否为 JSON 对象,如果是则递归