在 JsonPath 中,最简单直接的方法是通过静态方法 read() 读取 JSON 内容,如下:
package com.hxstrive.json_path; import com.jayway.jsonpath.JsonPath; import java.util.List; /** * Jayway JsonPath 入门示例 * @author hxstrive.com */ public class Demo { public static void main(String[] args) { String json = "{" + " \"store\": {" + " \"book\": [" + " {" + " \"category\": \"reference\"," + " \"author\": \"Nigel Rees\"," + " \"title\": \"Sayings of the Century\"," + " \"price\": 8.95" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Evelyn Waugh\"," + " \"title\": \"Sword of Honour\"," + " \"price\": 12.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Herman Melville\"," + " \"title\": \"Moby Dick\"," + " \"isbn\": \"0-553-21311-3\"," + " \"price\": 8.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"J. R. R. Tolkien\"," + " \"title\": \"The Lord of the Rings\"," + " \"isbn\": \"0-395-19395-8\"," + " \"price\": 22.99" + " }" + " ]," + " \"bicycle\": {" + " \"color\": \"red\"," + " \"price\": 19.95" + " }" + " }," + " \"expensive\": 10" + "}"; // 获取所有书籍的作者 List<String> authors = JsonPath.read(json, "$.store.book[*].author"); for(String author : authors) { System.out.println("author: " + author); } // 输出: //author: Nigel Rees //author: Evelyn Waugh //author: Herman Melville //author: J. R. R. Tolkien } }
如果你只想读取一次,上面的做法是没有问题的。如果您还需要读取其他路径,这就不是办法了,因为每次调用 JsonPath.read(...) 都会对文档进行解析。为了避免这个问题,可以先解析 json,然后在基于解析后的对象进行读取,例如:
package com.hxstrive.json_path; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import java.util.List; /** * Jayway JsonPath 入门示例 * @author hxstrive.com */ public class Demo2 { public static void main(String[] args) { String json = "{" + " \"store\": {" + " \"book\": [" + " {" + " \"category\": \"reference\"," + " \"author\": \"Nigel Rees\"," + " \"title\": \"Sayings of the Century\"," + " \"price\": 8.95" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Evelyn Waugh\"," + " \"title\": \"Sword of Honour\"," + " \"price\": 12.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Herman Melville\"," + " \"title\": \"Moby Dick\"," + " \"isbn\": \"0-553-21311-3\"," + " \"price\": 8.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"J. R. R. Tolkien\"," + " \"title\": \"The Lord of the Rings\"," + " \"isbn\": \"0-395-19395-8\"," + " \"price\": 22.99" + " }" + " ]," + " \"bicycle\": {" + " \"color\": \"red\"," + " \"price\": 19.95" + " }" + " }," + " \"expensive\": 10" + "}"; Object document = Configuration.defaultConfiguration().jsonProvider().parse(json); // 获取所有书籍的作者 List<String> authors = JsonPath.read(document, "$.store.book[*].author"); System.out.println("authors=" + authors); // 获取 expensive 的值 int expensive = JsonPath.read(document, "$.expensive"); System.out.println("expensive=" + expensive); // 获取 color 的值 String color = JsonPath.read(document, "$.store.bicycle.color"); System.out.println("color=" + expensive); } }
运行示例,输出内容:
authors=["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"] expensive=10 color=10
注意,JsonPath 还提供了一种链式的应用程序接口,这也是最灵活的一种,例如:
package com.hxstrive.json_path; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.ReadContext; import java.util.List; /** * Jayway JsonPath 入门示例 * @author hxstrive.com */ public class Demo3 { public static void main(String[] args) { String json = "{" + " \"store\": {" + " \"book\": [" + " {" + " \"category\": \"reference\"," + " \"author\": \"Nigel Rees\"," + " \"title\": \"Sayings of the Century\"," + " \"price\": 8.95" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Evelyn Waugh\"," + " \"title\": \"Sword of Honour\"," + " \"price\": 12.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Herman Melville\"," + " \"title\": \"Moby Dick\"," + " \"isbn\": \"0-553-21311-3\"," + " \"price\": 8.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"J. R. R. Tolkien\"," + " \"title\": \"The Lord of the Rings\"," + " \"isbn\": \"0-395-19395-8\"," + " \"price\": 22.99" + " }" + " ]," + " \"bicycle\": {" + " \"color\": \"red\"," + " \"price\": 19.95" + " }" + " }," + " \"expensive\": 10" + "}"; ReadContext ctx = JsonPath.parse(json); List<String> authorsOfBooksWithISBN = ctx.read("$.store.book[?(@.isbn)].author"); System.out.println(authorsOfBooksWithISBN); } } // 输出结果:["Herman Melville","J. R. R. Tolkien"]
或者
package com.hxstrive.json_path; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.ReadContext; import java.util.List; import java.util.Map; /** * Jayway JsonPath 入门示例 * @author hxstrive.com */ public class Demo4 { public static void main(String[] args) { String json = "{" + " \"store\": {" + " \"book\": [" + " {" + " \"category\": \"reference\"," + " \"author\": \"Nigel Rees\"," + " \"title\": \"Sayings of the Century\"," + " \"price\": 8.95" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Evelyn Waugh\"," + " \"title\": \"Sword of Honour\"," + " \"price\": 12.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"Herman Melville\"," + " \"title\": \"Moby Dick\"," + " \"isbn\": \"0-553-21311-3\"," + " \"price\": 8.99" + " }," + " {" + " \"category\": \"fiction\"," + " \"author\": \"J. R. R. Tolkien\"," + " \"title\": \"The Lord of the Rings\"," + " \"isbn\": \"0-395-19395-8\"," + " \"price\": 22.99" + " }" + " ]," + " \"bicycle\": {" + " \"color\": \"red\"," + " \"price\": 19.95" + " }" + " }," + " \"expensive\": 10" + "}"; List<Map<String, Object>> expensiveBooks = JsonPath .using(Configuration.defaultConfiguration()) .parse(json) .read("$.store.book[?(@.price > 20)]", List.class); System.out.println(expensiveBooks); } } // 输出结果:[{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]