json-path解析json方便可靠

JsonPath is to JSON 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
 
<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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值