Java实现修改json对象某个键值
Posted luffy5459
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java实现修改json对象某个键值相关的知识,希望对你有一定的参考价值。
json对象修改键值的需求,在实际中遇到的场景是这样的,得到终端上报的车道信息,车道位置信息包含经纬度,车道信息是一个数组,数组里面每个车道路段信息也包含经纬度,一般经纬度多半需要做一些简单的系数修正,或者其他的转换才可以使用,普通的做法就是直接修改键值,就是按照现有的json数据格式,依次通过层级关系找到经纬度的键,然后修改键值,这个不怎么通用。
下面介绍一个办法,就是递归的思想,修改json对象中的键值,注意,这里不是修改键,而是键值,就是修改key对应的value,不是key。
修改键值的思路其实很简单,就是依次遍历json结构体的所有键,针对如下三种情形做判断:
1、如果刚好是某个键,则修改。
2、如果键值是一个嵌套的json,那么需要继续调用修改方法,然后进入1的分支进行修改,修改完成,保存当前键值。
3、如果键值是一个嵌套的数组,还需要遍历每个数组元素,继续调用修改方法,也进入1的分支进行修改,修改完成,同样需要保存当前的键值。
==========================================================
上面的思路里面,2、3都是需要继续调用修改方法,这就形成了嵌套调用,也就是递归调用的思想。重要的不仅是修改,还需要保存修改之后的结果。
下面给出一个示例:
package com.xxx.huali.hualitest.json;
import java.util.Set;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class JsonObjectDemo {
public static void main(String[] args) {
String str = "{\\"id\\":101,\\"name\\":\\"buejee\\",\\"children\\":[{\\"id\\":1101,\\"name\\":\\"buejee1\\"},{\\"id\\":1102,\\"name\\":\\"buejee2\\"}],\\"sub\\":{\\"id\\":1011,\\"name\\":\\"buejee11\\"}}";
System.out.println(str);
JSONObject json = JSONObject.parseObject(update(str));
System.out.println(json);
}
public static String update(String str) {
JSONObject json = null;
json = JSONObject.parseObject(str);
Set<String> keySet = json.keySet();
for(String key:keySet) {
Object obj = json.get(key);
if(obj instanceof JSONArray) {
JSONArray arr = (JSONArray)obj;
for(int i=0;i<arr.size();i++) {
String child = update(arr.get(i).toString());
arr.set(i, JSONObject.parse(child));
}
json.put(key, arr);
}else if(obj instanceof JSONObject){
JSONObject sub = (JSONObject)obj;
String substr = update(sub.toJSONString());
json.put(key, JSONObject.parse(substr));
}else {
if(key.equals("id")) {
json.put(key, 100);
System.out.println("update...");
}
}
}
return json.toJSONString();
}
}
运行示例,打印结果:
{"id":101,"name":"buejee","children":[{"id":1101,"name":"buejee1"},{"id":1102,"name":"buejee2"}],"sub":{"id":1011,"name":"buejee11"}}
update...
update...
update...
update...
{"sub":{"name":"buejee11","id":100},"children":[{"name":"buejee1","id":100},{"name":"buejee2","id":100}],"name":"buejee","id":100}
示例模拟了一个带数组和json对象嵌套的json结构体,需要修改id的键值为100,这里实现了修改。
需要注意一下几点:
1、递归方法需要有返回值,这样才能得到嵌套调用的结果。
2、嵌套调用之后,需要将新的值保存起来,这样深层次的修改才能生效。
以上方法不足之处:
1、没有将需要修改的部分抽象出来,形成一个更通用的办法。
2、这里的修改,如果一开始就是一个json数组,那么就不适用了,但是如果知道了思路,修改其实也不难。
以上是关于Java实现修改json对象某个键值的主要内容,如果未能解决你的问题,请参考以下文章