2016-06-23 16 views
10

Có thể chỉ có một cú pháp duy nhất của một Jackson (và 'xuống') trong một cây JSON không?Sử dụng Jackson để ánh xạ đối tượng từ nút cụ thể trong cây JSON

Trường hợp sử dụng là định dạng tài liệu có thể mở rộng. Tôi muốn đi bộ trên cây và sau đó xuất bản đường dẫn hiện tại tới một bộ plugin mở rộng, để xem liệu người dùng có đang sử dụng và plugin biết phải làm gì với phần đó của tài liệu hay không.

Tôi muốn các tác giả plugin không phải xử lý các chi tiết cấp thấp của JsonNode hoặc API truyền trực tuyến; thay vào đó, chỉ cần được thông qua một số bối cảnh và cụ thể JsonNode, và sau đó có thể sử dụng ObjectMapper đáng yêu và thuận tiện để unmarshall một thể hiện của lớp học của họ, xem xét các nút thông qua như là gốc của cây.

+1

Âm thanh chính xác như sau: http://martinfowler.com/articles/refactoring-document-load.html#CreatingObjectsDeepInTheDocumentStructure –

Trả lời

13

Hãy xem xét các JSON sau:

{ 
    "firstName": "John", 
    "lastName": "Doe", 
    "address": { 
    "street": "21 2nd Street", 
    "city": "New York", 
    "postalCode": "10021-3100", 
    "coordinates": { 
     "latitude": 40.7250387, 
     "longitude": -73.9932568 
    } 
    } 
} 

Và xem xét bạn muốn phân tích nút coordinates vào lớp Java sau:

public class Coordinates { 

    private Double latitude; 

    private Double longitude; 

    // Default constructor, getters and setters omitted 
} 

Để làm điều đó, phân tích toàn bộ JSON thành một JsonNode với ObjectMapper:

String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"address\":{\"street\":" 
      + "\"21 2nd Street\",\"city\":\"New York\",\"postalCode\":\"10021-3100\"," 
      + "\"coordinates\":{\"latitude\":40.7250387,\"longitude\":-73.9932568}}}"; 

ObjectMapper mapper = new ObjectMapper(); 
JsonNode node = mapper.readTree(json); 

Sau đó sử dụng để truy vấn JSON Pointer nút coordinates và sử dụng ObjectMapper để phân tích nó vào lớp Coordinates:

JsonNode coordinatesNode = node.at("/address/coordinates"); 
Coordinates coordinates = mapper.treeToValue(coordinatesNode, Coordinates.class); 

JSON Pointer là một ngôn ngữ con đường phải đi qua JSON. Để biết thêm chi tiết, hãy xem RFC 6901. Nó có sẵn ở Jackson kể từ phiên bản 2.3.

+1

Đó chính xác là những gì tôi đã làm sau! Tôi sẽ trao tiền thưởng khi tôi đã có cơ hội thực hiện nó. –

+0

Tôi sẽ nói 'node.get (" address ")' là đơn giản/hiệu quả hơn cho trường hợp này. – shmosel

+1

@shmosel Tất nhiên rồi. Nhưng điểm ở đây là Đường dẫn JSON có thể được sử dụng để truy vấn một nút. JSON mà tôi cung cấp làm ví dụ thực sự đơn giản và chúng tôi không thể thấy những lợi thế của việc sử dụng Đường dẫn JSON. –

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