java操作json的两个库

主要是net.minidev.json和jayway.JsonPath包的运用

net.minidev.json

JSONValue

  • parse:

    • public static java.lang.Object parse(String/Reader/byte[]/inputsteam s)
    • Returns: Instance of the following: JSONObject, JSONArray, String, java.lang.Number, java.lang.Boolean, null
    • 参数还可以跟一个map to,作用貌似是将java映射到一个class里面去
    • 如果需要抛出exception可以用parseWithException
    • 常见用法

      1
      2
      3
      4
      5
      object obj = (Object) JSONValue.parse(str);
      if (obj == null || !(obj instanceof JSONObject)) return error;
      else {//这里一般我们是知道这个读出来的是jsonobject,当然如果原本应该是jsonarray之类的我们要改if。
      //do sth.
      }
  • toJSONString

    • public static String toJSONString(Object value)或
    • public static String toJSONString(Object value, JSONStyle compression)
    • 传入一个Object,转化为string。commpression表示压缩类型,暂时没看
  • isValidJson

    • public static boolean isValidJson(Reader/String in) throws IOException
    • 判断是不是json格式的object

JSONObject

首先要理解它extend一个hashmap 所以hashmap的get,put,clear之类操作他都有

  • JSONObject()/JSONObject(Map)

    • 初始化
  • merge(JsonObj o1, Object o2)

    • 其实第二个参数必须是instantof JSONobj或则null,否则会报error
  • toJSONString

JSONArray

继承自ArrayList, 所以有add contains,remove等操作

  • merge(Obejct o2)
    • o2可以是jsonobj也可以是jsonarray

JSONNavi

这个类主要提供一些操作。更多例子

1
2
3
4
5
6
7
@Override public void onMessage(String msg){
Message mapTo=new Message();
JSONValue.parse(msg,mapTo);
JSONNavi navi=JSONNavi.newInstance();
navi.set("room",mapTo.getRoom()).set("message","<b>" + name + "</b>: "+ mapTo.getMessage());
room.messageAll(navi.toString());
}

JsonPath

json是树形结构,所以jsonpath就是指的树上的路径

首先jsonpath有两种写法:
dot: $.store.book[0].title
bracket:$['store']['book'][0]['title']

读取:

1
2
3
4
5
String json = "...";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
String author0 = JsonPath.read(document, "$.store.book[0].author");
String author1 = JsonPath.read(document, "$.store.book[1].author");

一种更有效率的读取,通过设置context保存上下文信息

1
2
3
4
5
6
7
8
9
String json = "...";
ReadContext ctx = JsonPath.parse(json);
List<String> authorsOfBooksWithISBN = ctx.read("$.store.book[?(@.isbn)].author");
List<Map<String, Object>> expensiveBooks = JsonPath
.using(configuration)
.parse(json)
.read("$.store.book[?(@.price > 10)]", List.class);

设置filte:

1
2
3
4
5
6
Filter cheapFictionFilter = filter(
where("category").is("fiction").and("price").lte(10D)
);//and这里也可以是or
List<Map<String, Object>> books =
parse(json).read("$.store.book[?]", cheapFictionFilter);

他的手册写的就不错,可以直接看手册。minidev找不到手册啊,只能看api,还是1.x版的,我们都用2.x了,估计写的时候还是要看源码。。。


本文采用创作共用保留署名-非商业-禁止演绎4.0国际许可证,欢迎转载,但转载请注明来自http://thousandhu.github.io,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文链接:http://thousandhu.github.io/2015/11/14/java操作json的两个库/