使用jsonpath解析json内容
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用jsonpath解析json内容相关的知识,希望对你有一定的参考价值。
官网链接:https://github.com/jayway/JsonPath
JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。下面我把官网介绍的每个表达式用代码实现,可以更直观的知道该怎么用它。
一.首先需要依赖的jar包
二.因为编译的时候会报log4j的警报,所以需要在项目的src目录下新建log4j.properties文件,内容如下:
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
三.准备一个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 }
四.我们从代码中分析用法,代码如下
package com.jsonpath; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.Iterator; import java.util.List; import java.util.Map; import net.minidev.json.JSONArray; import com.jayway.jsonpath.Configuration; import com.jayway.jsonpath.JsonPath; import com.jayway.jsonpath.ReadContext; /** * @author QiaoJiafei * @version 创建时间:2016年3月2日 下午3:37:42 * 类说明 */ public class TestJsonPath { public static void main(String[] args) { // TODO Auto-generated method stub String sjson = readtxt(); //String sjson = "{\"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}"; print("--------------------------------------getJsonValue0--------------------------------------"); getJsonValue0(sjson); print("--------------------------------------getJsonValue1--------------------------------------"); getJsonValue1(sjson); print("--------------------------------------getJsonValue2--------------------------------------"); getJsonValue2(sjson); print("--------------------------------------getJsonValue3--------------------------------------"); getJsonValue3(sjson); print("--------------------------------------getJsonValue4--------------------------------------"); getJsonValue4(sjson); print("--------------------------------------getJsonValue--------------------------------------"); getJsonValue(sjson); } private static String readtxt() { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder(); try { FileReader fr = new FileReader("D:/workspace/PressureTest/json.txt"); BufferedReader bfd = new BufferedReader(fr); String s = ""; while((s=bfd.readLine())!=null) { sb.append(s); } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString(); } private static void getJsonValue(String json) { //The authors of all books List<String> authors1 = JsonPath.read(json, "$.store.book[*].author"); //All authors List<String> authors2 = JsonPath.read(json, "$..author"); //All things, both books and bicycles //authors3返回的是net.minidev.json.JSONArray List<Object> authors3 = JsonPath.read(json, "$.store.*"); //The price of everything List<Object> authors4 = JsonPath.read(json, "$.store..price"); //The third book List<Object> authors5 = JsonPath.read(json, "$..book[2]"); //The first two books List<Object> authors6 = JsonPath.read(json, "$..book[0,1]"); //All books from index 0 (inclusive) until index 2 (exclusive) List<Object> authors7 = JsonPath.read(json, "$..book[:2]"); //All books from index 1 (inclusive) until index 2 (exclusive) List<Object> authors8 = JsonPath.read(json, "$..book[1:2]"); //Last two books List<Object> authors9 = JsonPath.read(json, "$..book[-2:]"); //Book number two from tail List<Object> authors10 = JsonPath.read(json, "$..book[2:]"); //All books with an ISBN number List<Object> authors11 = JsonPath.read(json, "$..book[?(@.isbn)]"); //All books in store cheaper than 10 List<Object> authors12 = JsonPath.read(json, "$.store.book[?(@.price < 10)]"); //All books in store that are not "expensive" List<Object> authors13 = JsonPath.read(json, "$..book[?(@.price <= $[‘expensive‘])]"); //All books matching regex (ignore case) List<Object> authors14 = JsonPath.read(json, "$..book[?(@.author =~ /.*REES/i)]"); //Give me every thing List<Object> authors15 = JsonPath.read(json, "$..*"); //The number of books List<Object> authors16 = JsonPath.read(json, "$..book.length()"); print("**************authors1**************"); print(authors1); print("**************authors2**************"); print(authors2); print("**************authors3**************"); printOb(authors3); print("**************authors4**************"); printOb(authors4); print("**************authors5**************"); printOb(authors5); print("**************authors6**************"); printOb(authors6); print("**************authors7**************"); printOb(authors7); print("**************authors8**************"); printOb(authors8); print("**************authors9**************"); printOb(authors9); print("**************authors10**************"); printOb(authors10); print("**************authors11**************"); printOb(authors11); print("**************authors12**************"); printOb(authors12); print("**************authors13**************"); printOb(authors13); print("**************authors14**************"); printOb(authors14); print("**************authors15**************"); printOb(authors15); print("**************authors16**************"); printOb(authors16); } private static void getJsonValue0(String json) { // TODO Auto-generated method stub List<String> authors = JsonPath.read(json, "$.store.book[*].author"); //System.out.println(authors.size()); print(authors); } private static void getJsonValue1(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"); print(author0); print(author1); } private static void getJsonValue2(String json) { ReadContext ctx = JsonPath.parse(json); List<String> authorsOfBooksWithISBN = ctx.read("$.store.book[?(@.isbn)].author"); List<Map<String, Object>> expensiveBooks = JsonPath .using(Configuration.defaultConfiguration()) .parse(json) .read("$.store.book[?(@.price > 10)]", List.class); print(authorsOfBooksWithISBN); print("****************Map****************"); printListMap(expensiveBooks); } private static void getJsonValue3(String json) { //Will throw an java.lang.ClassCastException //List<String> list = JsonPath.parse(json).read("$.store.book[0].author"); //由于会抛异常,暂时注释上面一行,要用的话,应使用下面的格式 //Works fine String author = JsonPath.parse(json).read("$.store.book[0].author"); print(author); } private static void getJsonValue4(String json) { List<Map<String, Object>> books1 = JsonPath.parse(json) .read("$.store.book[?(@.price < 10 && @.category == ‘fiction‘)]"); List<Map<String, Object>> books2 = JsonPath.parse(json) .read("$.store.book[?(@.category == ‘reference‘ || @.price > 10)]"); print("****************books1****************"); printListMap(books1); print("****************books2****************"); printListMap(books1); } private static void print(List<String> list) { for(Iterator<String> it = list.iterator();it.hasNext();) { System.out.println(it.next()); } } private static void printOb(List<Object> list) { for(Iterator<Object> it = list.iterator();it.hasNext();) { System.out.println(it.next()); } } private static void printListMap(List<Map<String, Object>> list) { for(Iterator<Map<String, Object>> it = list.iterator();it.hasNext();) { Map<String, Object> map = it.next(); print("****"); for(Iterator iterator =map.entrySet().iterator();iterator.hasNext();) { System.out.println(iterator.next()); } } } private static void print(String s) { System.out.println(s); } }
1.首先我们看getJsonValue()这个方法的输出结果:
--------------------------------------getJsonValue-------------------------------------- **************authors1************** Nigel Rees Evelyn Waugh Herman Melville J. R. R. Tolkien **************authors2************** Nigel Rees Evelyn Waugh Herman Melville J. R. R. Tolkien **************authors3************** [{"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}] {color=red, price=19.95} **************authors4************** 8.95 12.99 8.99 22.99 19.95 **************authors5************** {category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99} **************authors6************** {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} **************authors7************** {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} **************authors8************** {category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99} **************authors9************** {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} **************authors10************** {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} **************authors11************** {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} **************authors12************** {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95} {category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99} **************authors13************** {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95} {category=fiction, author=Herman Melville, title=Moby Dick, isbn=0-553-21311-3, price=8.99} **************authors14************** {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95} **************authors15************** {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}} 10 [{"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}] {color=red, price=19.95} {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} reference Nigel Rees Sayings of the Century 8.95 fiction Evelyn Waugh Sword of Honour 12.99 fiction Herman Melville Moby Dick 0-553-21311-3 8.99 fiction J. R. R. Tolkien The Lord of the Rings 0-395-19395-8 22.99 red 19.95 **************authors16************** 4
2.然后看getJsonValue0()、getJsonValue1()、getJsonValue2()、getJsonValue3()、getJsonValue4()的输出结果
--------------------------------------getJsonValue0-------------------------------------- Nigel Rees Evelyn Waugh Herman Melville J. R. R. Tolkien --------------------------------------getJsonValue1-------------------------------------- Nigel Rees Evelyn Waugh --------------------------------------getJsonValue2-------------------------------------- Herman Melville J. R. R. Tolkien ****************Map**************** **** category=fiction author=Evelyn Waugh title=Sword of Honour price=12.99 **** category=fiction author=J. R. R. Tolkien title=The Lord of the Rings isbn=0-395-19395-8 price=22.99 --------------------------------------getJsonValue3-------------------------------------- Nigel Rees --------------------------------------getJsonValue4-------------------------------------- ****************books1**************** **** category=fiction author=Herman Melville title=Moby Dick isbn=0-553-21311-3 price=8.99 ****************books2**************** **** category=fiction author=Herman Melville title=Moby Dick isbn=0-553-21311-3 price=8.99
以上是关于使用jsonpath解析json内容的主要内容,如果未能解决你的问题,请参考以下文章