使用Play Framework和Java

时间:2015-05-04 12:36:35

标签: java arrays json playframework jackson

我有以下Json结构:

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

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

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

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

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

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

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

任何人都知道解析这样一个数组的简单方法吗? 提前致谢

2 个答案:

答案 0 :(得分:13)

你可以在for-each循环中这样做:

M-q

或者,如果你进入了lambdas:

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

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

另外...... 正确的方式来创建json.withArray("languages").forEach(language -> Logger.info("language -> " + language));

ArrayNode

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

答案 1 :(得分:1)

试试这个:

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();
}

这里我只是打印其中一个元素,但你当然可以做任何你想做的事情:)

希望这有帮助。