使用Play Framework和Java解析Json数组

jbr*_*ans 8 java arrays json jackson playframework

我有以下Json结构:

{
    "name": "John",
    "surname": "Doe",
    "languages": [
    {"language": "english", "level": "3"},
    {"language": "french", "level": "1"}
    ]
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Play Framework来解析HTTP消息中的Json数据,该消息是使用自行开发的REST服务发送的.我已经知道如何通过查看文档来解析Json数据中的名称和姓氏,这可以通过以下方式完成:

JsonNode json = request().body().asJson();
String name = json.findPath("name").textValue();
String surname = json.findPath("surname").textValue();
Run Code Online (Sandbox Code Playgroud)

现在我的问题是,我如何解析Json数据中的数组"语言".我发现了一些关于这个问题的其他帖子,但他们都使用Scala,我无法理解,所以我最好找一个Java解决方案.

我已经尝试了几件事,例如:

    List<JsonNode> languages = json.findPath("languages").getElements();
Run Code Online (Sandbox Code Playgroud)

根据文档,json.findPath()返回一个JsonNode,在其上可以调用函数getElements(),它将返回JsonNode的Iterator.但是我在getElements上遇到编译错误:"JsonNode类型的方法getElements()未定义"

谁知道解析这样一个数组的简单方法?提前致谢

seb*_*ter 13

您可以在for-each循环中执行此操作:

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

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

或者,如果你是lambdas:

json.withArray("languages").forEach(language -> Logger.info("language -> " + language));
Run Code Online (Sandbox Code Playgroud)

另外...... 创建一个正确的方法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();
Run Code Online (Sandbox Code Playgroud)

你应该真正了解更多关于jackson/fasterxml的功能.这是一个非常高效的lib.JacksonInFiveMinutes是一个良好的开端.