JSONPath 按路径操作 JSON
String json = "{\"arr\":[{\"name\":\"zpl0\",\"id\":0},{\"name\":\"zpl1\",\"id\":1},{\"name\":\"zpl2\",\"id\":2},{\"name\":\"zpl3\",\"id\":3},{\"name\":\"zpl4\",\"id\":4}],\"name\":\"zpl\",\"id\":1}\n";
final JSONObject jsonObject = JSONObject.parseObject(json);
Object rootName = JSONPath.eval(jsonObject, "$.name");
System.out.println(rootName);
Object rootArr = JSONPath.eval(jsonObject, "$.arr");
System.out.println(rootArr); // 获取数组
Object names = JSONPath.eval(jsonObject, "$.arr.name"); // 获取数组中的值的
System.out.println(names);
输出信息,路径中有数组,那么找到的值也将是数组返回
zpl
[{"name":"zpl0","id":0},{"name":"zpl1","id":1},{"name":"zpl2","id":2},{"name":"zpl3","id":3},{"name":"zpl4","id":4}]
["zpl0","zpl1","zpl2","zpl3","zpl4"]
其他的一些方法
public class JSONPath {
// 求值,静态方法
public static Object eval(Object rootObject, String path);
// 求值,静态方法,按需计算,性能更好
public static Object extract(String json, String path);
// 计算Size,Map非空元素个数,对象非空元素个数,Collection的Size,数组的长度。其他无法求值返回-1
public static int size(Object rootObject, String path);
// 是否包含,path中是否存在对象
public static boolean contains(Object rootObject, String path) { }
// 是否包含,path中是否存在指定值,如果是集合或者数组,在集合中查找value是否存在
public static boolean containsValue(Object rootObject, String path, Object value) { }
// 修改制定路径的值,如果修改成功,返回true,否则返回false
public static boolean set(Object rootObject, String path, Object value) {}
// 在数组或者集合中添加元素
public static boolean arrayAdd(Object rootObject, String path, Object... values);
// 获取,Map的KeySet,对象非空属性的名称。数组、Collection等不支持类型返回null。
public static Set<?> keySet(Object rootObject, String path);
}
常见问题
JSON.toJSONString 出现 $ref
问题原因:给定的对象中出现了引用(重复应用、循环引用),简单说某一个对象被多个值引用了,如下面这样
final JSONObject billOrderAddress = buildBillOrderAddressInfo(otherParams);
data.put("BillOrderAddress", billOrderAddress);
data.put("ShipOrderAddress", billOrderAddress);
重复引用解决方法:
单个关闭 JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
全局配置关闭 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();
循环引用笔者也是记得也是可以通过配置解决的,以后遇到再说