我有以下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;
}
答案 0 :(得分:1)
您的问题是,当您尝试递归处理JSON时,在每个递归级别上,您都在处理不同 JSON文档并将数据写入到不同 Map
。
您的函数接受一个字符串,然后将其解析为JSONObject
。您创建一个Map
来保存一些数据。第一次通过mapfillData
时,您只会找到一个密钥data
。然后,假设您的if
逻辑正常工作(我没有尝试运行它),您将把data
的内容呈现为另一个字符串并递归调用mapfillData
。
现在,您正在第二次致电mapfillData
,并创建另一个Map
。这次您找到attributes
,然后再次致电mapfillData
。在第三次调用中,您发现了一些变量,并将这些值写入Map
时将其替换。在函数末尾,您返回Map
,但是调用者(第二次调用mapfillData
)对返回的Map
无效,并且所有数据都丢失了
我会
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);