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对象某个键值的主要内容,如果未能解决你的问题,请参考以下文章

js如何删除json里的值

怎么将json对象添加进json数组中

如何用setData修改数组

javascript JS中通过名单转地图类型或Json的对象实现键值对

Java中面向对象的三大特性之封装

json数组转java对象怎么转