JsonPath解析Json数据

JsonPath to JSON is what XPATH is to XML, a simple way to extract parts of a given document. JsonPath is available in many programming languages such as Javascript, Python and PHP. Now also in Java!

News:

2013-09-27 Released 0.9.0 bug fixes, general improvements

2012-04-16 Released 0.8.1 bug fixes, improved docs, general improvements

2012-03-08 Released 0.8.0 bug fixes, Filter builder, Json model, POJO mapping (optional) and compliance improvements.

2012-02-09 Released 0.5.6 including bug fixes and performance improvements.

 

Given:

{ "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,

        "isbn": "0-553-21311-3"

      }

    ],

    "bicycle": {

      "color": "red",

      "price": 19.95

    }

  }

}

 

Read

 

All authors:

 

List<String> authors = JsonPath.read(json, "$.store.book[*].author");

 

Author of first book in store:

 

String author = JsonPath.read(json, "$.store.book[1].author");

 

All books with category = "reference"

 

List<Object> books = JsonPath.read(json, "$.store.book[?(@.category == 'reference')]");

 

List<Object> books = JsonPath.read(json, "$.store.book[?]", filter(where("category").is("reference")));

 

All books that cost more than 10 USD

 

List<Object> books = JsonPath.read(json, "$.store.book[?(@.price > 10)]");

 

List<Object> books = JsonPath.read(json, "$.store.book[?]", filter(where("price").gt(10)));

 

All books that have isbn

 

List<Object> books = JsonPath.read(json, "$.store.book[?(@.isbn)]");

 

List<Object> books = JsonPath.read(json, "$.store.book[?]", filter(where("isbn").exists(true)));

 

Chained filters

 

Filter filter = Filter.filter(Criteria.where("isbn").exists(true).and("category").in("fiction", "reference"))

 

List<Object> books = JsonPath.read(json, "$.store.book[?]", filter);

 

Custom filters

 

Filter myFilter = new Filter.FilterAdapter<Map<String, Object>>(){

                @Override

                public boolean accept(Map<String, Object> map) {

                     return map.containsKey("isbn");  

                }

            };

 

List<Object> books = JsonPath.read(json, "$.store.book[?]", myFilter);

 

All prices in the document

 

List<Double> prices = JsonPath.read(json, "$..price");

 

Compiled path

 

You can pre compile a path and use it multiple times

 

JsonPath path = JsonPath.compile("$.store.book[*]");

 

List<Object> books = path.read(json);

 

Assert

 

Asserts are made with Hamcrest matchers

 

JsonAssert.with(json).assertThat("$.store.bicycle.color", Matchers.equalTo("red"))

          .assertThat("$.store.bicycle.price", Matchers.equalTo(19.95D));

 

Add some static imports and you get this

 

with(json).assertThat("$.store.bicycle.color", equalTo("red"))

          .assertThat("$.store.bicycle.price", equalTo(19.95D));

 

The Hamcrest library contains a lot of different matchers and they can often be nested.

 

with(json).assertThat("$..author", hasItems("Nigel Rees", "Evelyn Waugh"))

          .assertThat("$..author", is(collectionWithSize(equalTo(2))));

 

with(json).assertThat("$.store.book[?(@.category == 'x')]", emptyCollection());

 

If you don't find the matcher you need, roll your own.

Download

 

Json-path is available at Maven Central,add below dependency into pom.xml : 

<dependency>

    <groupId>com.jayway.jsonpath</groupId>

    <artifactId>json-path</artifactId>

    <version>0.9.1</version>

</dependency>

<dependency>

    <groupId>com.jayway.jsonpath</groupId>

    <artifactId>json-path-assert</artifactId>

    <version>0.9.1</version>

    <scope>test</scope>

</dependency>

转载于:https://my.oschina.net/u/942203/blog/685977

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值