2015-05-04 14 views
6

tôi có cấu trúc Json sau:Phân tích một mảng Json sử dụng Chơi Framework và Java

{ 
    "name": "John", 
    "surname": "Doe", 
    "languages": [ 
    {"language": "english", "level": "3"}, 
    {"language": "french", "level": "1"} 
    ] 
} 

Tôi đang sử dụng khung Play để phân tích dữ liệu JSON từ một thông điệp HTTP, được gửi bằng cách sử dụng một tự phát triển Dịch vụ REST. Tôi biết đã làm thế nào tôi có thể phân tích cú pháp tên và họ từ dữ liệu JSON bằng cách nhìn vào các tài liệu, điều này được thực hiện bằng cách:

JsonNode json = request().body().asJson(); 
String name = json.findPath("name").textValue(); 
String surname = json.findPath("surname").textValue(); 

Bây giờ câu hỏi của tôi là, làm thế nào tôi có thể phân tích các mảng "ngôn ngữ" trong Json dữ liệu. Tôi đã tìm thấy một số bài viết khác về vấn đề này, nhưng tất cả họ đều sử dụng Scala, mà tôi không thể có được đầu của tôi xung quanh, vì vậy tốt hơn là tôi đang tìm kiếm một giải pháp Java.

Tôi đã thử một vài điều, ví dụ như này:

List<JsonNode> languages = json.findPath("languages").getElements(); 

Theo json.findPath tài liệu() trả về một JsonNode, trên đó có thể được gọi là getElements function(), mà sẽ trở lại một Iterator của JsonNode. Nhưng tôi nhận được một lỗi biên dịch trên getElements: "Phương thức getElements() không được xác định cho loại JsonNode"

Bất kỳ ai biết cách dễ dàng để phân tích cú pháp mảng như vậy? Cảm ơn trước

Trả lời

11

Bạn có thể làm điều đó trong một for-each vòng lặp như thế này:

JsonNode json = request().body().asJson(); 

for (JsonNode language : json.withArray("languages")) { 
    Logger.info("language -> " + language.get("someField").asText()); 
    //do something else 
} 

Hoặc, nếu bạn đang vào lambdas:

json.withArray("languages").forEach(language -> Logger.info("language -> " + language)); 

Cũng ... các đúng cách để tạo một số ArrayNode:

//using a mapper(important subject the mapper is) 
ObjectMapper mapper = new ObjectMapper(); 
ArrayNode array = mapper.createArrayNode(); 

//using an existing ArrayNode from a JsonNode 
ArrayNode array = json.withArray("fieldName"); 

//or using Play's Json helper class 
ArrayNode array = Json.newArray(); 

Bạn thực sự nên đọc thêm về thứ e khả năng của jackson/fastxml. Đó là rất lib hoạt động. Một khởi đầu tốt là JacksonInFiveMinutes.

+0

Thx để biết mẹo! Hãy kiểm tra nó khi tôi nói. – jensbrulmans

+0

Tôi quản lý để đạt được những gì tôi muốn bằng cách sử dụng 'mảng mảng Mảng = json.withArray (" fieldName ");' Cảm ơn bạn rất nhiều sebster! – jensbrulmans

+0

@sebster bạn đã thực hiện một ngày của tôi. Hoạt động hoàn hảo –

1

Hãy thử điều này:

JsonNode node = (JsonNode)json.findPath("languages"); 
ArrayNode arr = (ArrayNode)node; 
Iterator<JsonNode> it = arr.iterator(); 
while (it.hasNext()) { 
    JSONObject obj = it.next(); 
    System.out.println("language: " + obj.findPath("language").getTextValue(); 
} 

Ở đây tôi chỉ đơn giản là in một trong những yếu tố, nhưng bạn có thể làm bất cứ điều gì bạn muốn tất nhiên :)

Hope this helps.

+0

Phương thức khởi tạo của JSONArray dường như không chấp nhận đối tượng kiểu 'JsonNode'. _ "JSONException: Giá trị ban đầu của JSONArray phải là một chuỗi hoặc tập hợp hoặc mảng." _ – jensbrulmans

+0

Thật sao? Đó là một chút kỳ lạ. Tôi đã chỉnh sửa câu trả lời của mình để thử và đưa ra một tùy chọn khác. Tôi không nghĩ rằng tôi có bất kỳ cách nào khác trong tâm trí nếu điều đó không hoạt động. Có lý do nào khiến bạn sử dụng Play Framework một cách cụ thể hoặc bạn có thể thử phân tích cú pháp khác không? Nếu vậy, tôi khuyên bạn nên Gson hoặc một cái gì đó như thế, nó thân thiện hơn với Java (và được viết nhiều hơn với các ví dụ Java :)) –

+0

@OriLentz: Bạn không có nghĩa là nút 'ArrayNode arr = (ArrayNode);'? – ccheneson

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