2011-11-20 41 views
9

Tôi đã tìm thấy một số câu trả lời là gần với những gì tôi đang cố gắng để làm, nhưng chưa đủ mà tôi đã có thể để có được nó để làm việc. Tôi có một bó JSON trông giống như ví dụ này (chỉ thực sự ở một vài cấp độ sâu hơn và với hàng trăm mục ở cấp độ mà tôi muốn truy cập): {"query":{"pages":{"links":[{"word":"bobsyeruncle","code":4},{"word":"easyaspie","code":3}]}}}. Tôi không thể thay đổi định dạng; đó là API của người khác. Có khá nhiều thứ mà tôi không cần; trong thực tế, tôi chỉ muốn một cái gì đó giống như một mảng ["bobsyeruncle", "easyaspie"]. (Hoặc một Danh sách hoặc bất kỳ thứ gì.)Lấy chuỗi từ mảng JSON sử dụng Jackson

Tôi đã thử nghiệm với một phiên bản JSON đơn giản hơn không có mảng và có thể truy cập một chuỗi đơn giản bằng cách sử dụng rootNode.get ("truy vấn"). ("trang") ... cách được mô tả trong https://stackoverflow.com/questions/338586/a-better-java-json-library/338608#338608. Nhưng tôi đã không thể có được ở mảng như vậy. Hầu hết các câu trả lời tôi đã tìm thấy ở đây giả định rằng tôi muốn tạo một POJO như "Liên kết" bao gồm cả "từ" và "mã" mà tôi không có. Để truy cập vào chuỗi tôi muốn, có cần tạo một thứ gì đó giống như danh sách "Liên kết" bao gồm cả "từ" và "mã" và sau đó bỏ qua "mã" không? Điều đó có vẻ không đúng.

(Ngoài ra, nếu có ai có thể chỉ cho tôi tài liệu/hướng dẫn ở đâu đó ở giữa hướng dẫn JacksonInFiveMinutes và cả javadoc, tôi chắc chắn rằng sẽ giúp quá.)

ETA này làm việc, tôi nghĩ !:

  String theJsonString = "{\"query\":{\"pages\":{\"links\":" 
       + "[{\"word\":\"bobsyeruncle\"},{\"word\":\"easyaspie\"}]}}}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     JsonNode rootNode = mapper.readTree(theJsonString); 
     JsonNode interestingObjectNode = rootNode.path("query").path("pages").path("links"); 
     for (int i = 0; i < interestingObjectNode.size(); i ++) { 
      System.out.println(interestingObjectNode.get(i).path("word").asText()); 
     } 

Trả lời

7

Có lẽ blog entry này có thể giúp: Traversing JSON trees with Jackson?

Tôi không chắc chắn đó chính xác vấn đề mà bạn có, nhưng có một điều cần lưu ý là Mảng JSON nằm ngang bằng cách thông qua chỉ số nhập cảnh, không phải là tên. Vì vậy, trong khi bạn sử dụng objectNode.get("key"), thay vào đó bạn sử dụng arrayNode.get(0). Hoặc, nếu bạn muốn chơi an toàn và cho phép "mất tích" mục, sử dụng arrayNode.path(0) (và như trên cho JSON Objects).

Cũng nên nhớ rằng bạn có thể quay trở lại giữa JSON Trees (JsonNode) và POJO; ObjectMapper có nhiều phương thức để chuyển đổi giữa các biểu diễn (convertValue(), readAsTree(), treeToValue(), valueToTree()). Vì vậy, có thể sử dụng ràng buộc dữ liệu cho một số phần, mô hình cây cho người khác; đôi khi gắn các cây con dưới dạng các POJO, các thời điểm khác chỉ cần kết nối dữ liệu ở mức cao và truy cập các cây con bằng cách sử dụng mô hình cây. Đây là một cách rất mạnh mẽ để làm mọi thứ, nhưng phải mất một thời gian làm quen.

Hy vọng điều này sẽ hữu ích!

+0

Đã xóa nhận xét trước đó của tôi - tôi đã đến đó cuối cùng, đặt một số mã ở trên trong trường hợp có ai đó tìm thấy câu hỏi này. – umbraphile

+0

An toàn? u có nghĩa là gì bởi "An toàn" trong việc sử dụng jackson đó? @StaxMan – gumuruh

+0

Có nghĩa là an toàn nếu bạn sử dụng 'get', và không có nút nào phù hợp, nó trả về null và phải được kiểm tra. Nhưng với 'đường dẫn', một "nút bị thiếu" ảo được trả về, do đó không cần kiểm tra null. – StaxMan

0

Trong GSON của Google nếu bạn tạo POJO thiếu một số thuộc tính, thì JSON bỏ qua sẽ bị bỏ qua. Nó chỉ điền các thuộc tính có tên phù hợp. Tại sao không tạo một lớp học như thế này:

Query{ 
Pages{ 
Word[] Links; 
} 
} 

Word{ 
String word; 
String code; 
} 

và sau đó sử dụng LambdaJ để tránh viết tất cả các vòng để nhận các từ?

Nếu đó không phải là hấp dẫn nhìn here và thử JSONPath

Rất nhiều tài liệu cơ sở dữ ngoài kia như MongoDB và RavenDB vv sử dụng JSON như là định dạng của họ để lưu trữ. Truy vấn JSON phức tạp được tích hợp vào chúng, sử dụng cùng thư viện mà chúng đang sử dụng.

+1

Để lại một bình luận với lý do tại sao bạn đang đưa ra bỏ phiếu tiêu cực? Nếu đó là mã - nó rõ ràng là một mã giả giải thích thành phần của các lớp POJO khác nhau. – Zasz

+0

Câu hỏi ban đầu chỉ ra rằng việc sử dụng các định nghĩa POJO không được mong muốn, vì vậy có thể chỉ cải thiện từ ngữ để gợi ý rằng thay vì cách tiếp cận của mình, vẫn xem xét ràng buộc dữ liệu?(ditto để sử dụng jackson vs gson) – StaxMan

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