JSONPath 按路径操作 JSON

  1. 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";
  2. final JSONObject jsonObject = JSONObject.parseObject(json);
  3. Object rootName = JSONPath.eval(jsonObject, "$.name");
  4. System.out.println(rootName);
  5. Object rootArr = JSONPath.eval(jsonObject, "$.arr");
  6. System.out.println(rootArr); // 获取数组
  7. Object names = JSONPath.eval(jsonObject, "$.arr.name"); // 获取数组中的值的
  8. System.out.println(names);

输出信息,路径中有数组,那么找到的值也将是数组返回

  1. zpl
  2. [{"name":"zpl0","id":0},{"name":"zpl1","id":1},{"name":"zpl2","id":2},{"name":"zpl3","id":3},{"name":"zpl4","id":4}]
  3. ["zpl0","zpl1","zpl2","zpl3","zpl4"]

其他的一些方法

  1. public class JSONPath {
  2. // 求值,静态方法
  3. public static Object eval(Object rootObject, String path);
  4. // 求值,静态方法,按需计算,性能更好
  5. public static Object extract(String json, String path);
  6. // 计算Size,Map非空元素个数,对象非空元素个数,Collection的Size,数组的长度。其他无法求值返回-1
  7. public static int size(Object rootObject, String path);
  8. // 是否包含,path中是否存在对象
  9. public static boolean contains(Object rootObject, String path) { }
  10. // 是否包含,path中是否存在指定值,如果是集合或者数组,在集合中查找value是否存在
  11. public static boolean containsValue(Object rootObject, String path, Object value) { }
  12. // 修改制定路径的值,如果修改成功,返回true,否则返回false
  13. public static boolean set(Object rootObject, String path, Object value) {}
  14. // 在数组或者集合中添加元素
  15. public static boolean arrayAdd(Object rootObject, String path, Object... values);
  16. // 获取,Map的KeySet,对象非空属性的名称。数组、Collection等不支持类型返回null。
  17. public static Set<?> keySet(Object rootObject, String path);
  18. }

常见问题

JSON.toJSONString 出现 $ref

详细解决方案参考此博客

问题原因:给定的对象中出现了引用(重复应用、循环引用),简单说某一个对象被多个值引用了,如下面这样

  1. final JSONObject billOrderAddress = buildBillOrderAddressInfo(otherParams);
  2. data.put("BillOrderAddress", billOrderAddress);
  3. data.put("ShipOrderAddress", billOrderAddress);

重复引用解决方法:

  1. 单个关闭 JSON.toJSONString(object, SerializerFeature.DisableCircularReferenceDetect);
  2. 全局配置关闭 JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.DisableCircularReferenceDetect.getMask();

循环引用笔者也是记得也是可以通过配置解决的,以后遇到再说