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,数组的长度。其他无法求值返回-1public 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,否则返回falsepublic 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();
循环引用笔者也是记得也是可以通过配置解决的,以后遇到再说
