有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Play框架和Java解析Json数组

我有以下Json结构:

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

我正在使用Play框架解析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的迭代器。但是我在getElements上得到了一个编译错误:“类型JsonNode的方法getElements()未定义”

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


共 (2) 个答案

  1. # 1 楼答案

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

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

    或者,如果您喜欢lambdas:

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

    还有。。。创建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();
    

    您应该阅读更多关于jackson/fasterxml功能的内容。这是一个非常出色的库。良好的开端是JacksonInFiveMinutes

  2. # 2 楼答案

    试试这个:

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

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

    希望这有帮助