如何使用 java 替换动态 json 对象中给定键路径的值
How to replace a value of the given key path in dynamic json object using java
我有动态的 JSONs 和它们的关键路径,
我需要更改收到的密钥路径
上 Json 的值
例如,下面有 JSON 和密钥 (cars.car1)
{
"name":"John",
"age":null,
"time":"2021",
"vType":"yes",
"cars":{
"car1":"Ford",
"car2":"BMW",
"car3":"Fiat"
},
"lastOverScore":[
4,
1,
6,
6,
2,
1
],
"letterSet":[
"a",
"b",
"c",
"d"
]
}
我需要将 cars.car1. 的值更改为“Benz”。
另请注意
JSON 正文及其键会不时更改。
举个例子,下次我可能会得到一个完全不同的 JSON 正文和相关的密钥。
下面JSON的关键是:errors.source.pointer
(需要更改给定键的值)
{
"errors": [
{
"source": { "pointer": "test" },
"detail": "Missing `data` Member at document's top level."
}
]
}
想用 Java
做到这一点
您可以反序列化为 Map<String, Object>
(对象可以是另一个类似的映射),进入结构,进行更改,序列化为 json,
或者...
json = json.replaceAll("(?s)(\"cars":.*?\"car1":").*?\"", "" + newValue + "\"");
通过下面的代码可以替换或删除给定的项目。
public JSONObject updateOrRemoveJsonProperty(Object js1, String keys, Object valueNew, ConfigData.JsonBuildType payloadEnum, String targetKey){
try {
List<String> keyMain = new LinkedList<String>(Arrays.asList(keys.split("\.")));
for (int i = 0; i < keyMain.size(); i++) {
if(js1 instanceof JSONObject || js1 instanceof JSONArray){
if(keyMain.size() >1 && i+1 < keyMain.size()) {
String tmpKey= "";
String stringArray ="";
try {
tmpKey = keyMain.get(i);
keyMain.remove(i);
stringArray = StringUtils.join(keyMain, ".");
keyMain.clear();
updateOrRemoveJsonProperty(((JSONObject) js1).get(tmpKey), stringArray, valueNew, payloadEnum, targetKey);
}catch (JSONException js){
if(!tmpKey.isEmpty() && tmpKey.matches(KeyMapper.KEYLSTREGX)){
String[] tmp = tmpKey.replaceFirst(KeyMapper.KEYLSTREGX, ", ").split(",");
try {
updateOrRemoveJsonProperty((JSONArray)(((JSONArray)((JSONObject) js1).get(tmp[0])).get(Integer.parseInt(tmp[1].trim()))), stringArray, valueNew, payloadEnum, targetKey);
}catch (ClassCastException ex){
updateOrRemoveJsonProperty((JSONObject)(((JSONArray)((JSONObject) js1).get(tmp[0])).get(Integer.parseInt(tmp[1].trim()))), stringArray, valueNew, payloadEnum, targetKey);
}
}
}
} else {
if((keyMain.get(i)).length() > 2 && keyMain.get(i).matches(KeyMapper.KEYLSTREGX)){
String[] tmp = keyMain.get(i).replaceFirst(KeyMapper.KEYLSTREGX, ", ").split(",");
if(targetKey != "" && tmp[0].trim().equals(targetKey) && !payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)) {
((JSONObject) js1).put(tmp[0], valueNew);
} else if (targetKey != "" && tmp[0].trim().equals(targetKey) && payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)){
((JSONObject) js1).remove(tmp[0]);
}
}
if(targetKey != "" && keyMain.get(i).equals(targetKey) && !payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)) {
((JSONObject) js1).put(keyMain.get(i), valueNew);
} else if (targetKey != "" && keyMain.get(i).equals(targetKey) && payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)){
((JSONObject) js1).remove(keyMain.get(i));
}
}
}
}
}catch (JSONException ex){
}
return (JSONObject) js1;
}
我有动态的 JSONs 和它们的关键路径, 我需要更改收到的密钥路径
上 Json 的值例如,下面有 JSON 和密钥 (cars.car1)
{
"name":"John",
"age":null,
"time":"2021",
"vType":"yes",
"cars":{
"car1":"Ford",
"car2":"BMW",
"car3":"Fiat"
},
"lastOverScore":[
4,
1,
6,
6,
2,
1
],
"letterSet":[
"a",
"b",
"c",
"d"
]
}
我需要将 cars.car1. 的值更改为“Benz”。 另请注意 JSON 正文及其键会不时更改。
举个例子,下次我可能会得到一个完全不同的 JSON 正文和相关的密钥。
下面JSON的关键是:errors.source.pointer (需要更改给定键的值)
{
"errors": [
{
"source": { "pointer": "test" },
"detail": "Missing `data` Member at document's top level."
}
]
}
想用 Java
做到这一点您可以反序列化为 Map<String, Object>
(对象可以是另一个类似的映射),进入结构,进行更改,序列化为 json,
或者...
json = json.replaceAll("(?s)(\"cars":.*?\"car1":").*?\"", "" + newValue + "\"");
通过下面的代码可以替换或删除给定的项目。
public JSONObject updateOrRemoveJsonProperty(Object js1, String keys, Object valueNew, ConfigData.JsonBuildType payloadEnum, String targetKey){
try {
List<String> keyMain = new LinkedList<String>(Arrays.asList(keys.split("\.")));
for (int i = 0; i < keyMain.size(); i++) {
if(js1 instanceof JSONObject || js1 instanceof JSONArray){
if(keyMain.size() >1 && i+1 < keyMain.size()) {
String tmpKey= "";
String stringArray ="";
try {
tmpKey = keyMain.get(i);
keyMain.remove(i);
stringArray = StringUtils.join(keyMain, ".");
keyMain.clear();
updateOrRemoveJsonProperty(((JSONObject) js1).get(tmpKey), stringArray, valueNew, payloadEnum, targetKey);
}catch (JSONException js){
if(!tmpKey.isEmpty() && tmpKey.matches(KeyMapper.KEYLSTREGX)){
String[] tmp = tmpKey.replaceFirst(KeyMapper.KEYLSTREGX, ", ").split(",");
try {
updateOrRemoveJsonProperty((JSONArray)(((JSONArray)((JSONObject) js1).get(tmp[0])).get(Integer.parseInt(tmp[1].trim()))), stringArray, valueNew, payloadEnum, targetKey);
}catch (ClassCastException ex){
updateOrRemoveJsonProperty((JSONObject)(((JSONArray)((JSONObject) js1).get(tmp[0])).get(Integer.parseInt(tmp[1].trim()))), stringArray, valueNew, payloadEnum, targetKey);
}
}
}
} else {
if((keyMain.get(i)).length() > 2 && keyMain.get(i).matches(KeyMapper.KEYLSTREGX)){
String[] tmp = keyMain.get(i).replaceFirst(KeyMapper.KEYLSTREGX, ", ").split(",");
if(targetKey != "" && tmp[0].trim().equals(targetKey) && !payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)) {
((JSONObject) js1).put(tmp[0], valueNew);
} else if (targetKey != "" && tmp[0].trim().equals(targetKey) && payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)){
((JSONObject) js1).remove(tmp[0]);
}
}
if(targetKey != "" && keyMain.get(i).equals(targetKey) && !payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)) {
((JSONObject) js1).put(keyMain.get(i), valueNew);
} else if (targetKey != "" && keyMain.get(i).equals(targetKey) && payloadEnum.equals(ConfigData.JsonBuildType.REMOVE)){
((JSONObject) js1).remove(keyMain.get(i));
}
}
}
}
}catch (JSONException ex){
}
return (JSONObject) js1;
}