2015-12-05 15 views
10

Tôi đang nhận được một tài liệu json lớn và tôi muốn phân tích cú pháp chỉ một số phần của nó cho các lớp java của tôi. Tôi đã suy nghĩ để sử dụng một cái gì đó như jsonpath để trích xuất một phần dữ liệu từ nó thay vì tạo toàn bộ hệ thống phân cấp của các lớp java.Jsonpath với Jackson hoặc Gson

Jackson hoặc Gson có hỗ trợ jsonpath theo bất kỳ cách nào không? Nếu có, bạn có thể vui lòng cung cấp cho tôi một số ví dụ hoặc chỉ đến một thư viện chuẩn khác cho mục đích này không?

Ví dụ cho phép nói rằng tôi có một tài liệu dưới đây và tôi muốn trích xuất chỉ dưới đây dữ liệu từ nó trong lớp học java của tôi:

$ .store.book [0] - Chỉ cuốn sách đầu tiên $ .store.bicycle .price - giá của xe đạp

{ 
    "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 
} 
+0

Không có thư viện nào trong số hai thư viện này đều có hỗ trợ jsonpath gốc; có một thư viện hoạt động trên Jackson. – fge

Trả lời

11

Thư viện Jayway JsonPath hỗ trợ đọc giá trị sử dụng đường dẫn JSON.

Ví dụ:

String json = "..."; 

Map<String, Object> book = JsonPath.read(json, "$.store.book[0]"); 
System.out.println(book); // prints {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95} 

Double price = JsonPath.read(json, "$.store.bicycle.price"); 
System.out.println(price); // prints 19.95 

Bạn cũng có thể lập bản đồ JSON đối tượng trực tiếp đến các lớp học, như trong GSON hoặc Jackson:

Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class); 
System.out.println(book); // prints Book{category='reference', author='Nigel Rees', title='Sayings of the Century', price=8.95} 

Nếu bạn muốn đặc biệt sử dụng GSON hoặc Jackson để làm deserialization (mặc định là sử dụng json-smart), bạn cũng có thể định cấu hình này:

Configuration.setDefaults(new Configuration.Defaults() { 
    private final JsonProvider jsonProvider = new JacksonJsonProvider(); 
    private final MappingProvider mappingProvider = new JacksonMappingProvider(); 

    @Override 
    public JsonProvider jsonProvider() { 
     return jsonProvider; 
    } 

    @Override 
    public MappingProvider mappingProvider() { 
     return mappingProvider; 
    } 

    @Override 
    public Set<Option> options() { 
     return EnumSet.noneOf(Option.class); 
    } 
}); 

Xem the documentation để biết thêm chi tiết.

Các vấn đề liên quan