【问题标题】:Parsing a Json array using Play Framework and Java使用 Play Framework 和 Java 解析 Json 数组
【发布时间】:2015-07-13 20:29:21
【问题描述】:

我有以下 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 上得到一个编译错误:“方法 getElements() 未定义 JsonNode 类型”

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

【问题讨论】:

    标签: java arrays json playframework jackson


    【解决方案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();
    }
    

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

    希望这会有所帮助。

    【讨论】:

    • 不幸的是,JSONArray 的构造函数似乎不接受“JsonNode”类型的对象。 "JSONException: JSONArray 初始值应该是字符串或集合或数组。"
    • 真的吗?这有点奇怪。我已经编辑了我的答案以尝试提供另一种选择。如果这不起作用,我认为我没有其他办法。您是否有理由专门使用 Play Framework,或者您可以尝试不同的解析?如果是这样,我推荐 Gson 或类似的东西,它对 Java 更友好(并且用 Java 示例记录了更多:))
    • @OriLentz:你不是说ArrayNode arr = (ArrayNode)node;吗?
    【解决方案2】:

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

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

    或者,如果您喜欢 lambda:

    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

    【讨论】:

    • 谢谢小费!我说话的时候去看看。
    • 我设法通过使用ArrayNode array = json.withArray("fieldName"); 实现了我想要的,非常感谢sebster!
    • @sebster 你让我开心。完美运行
    • 除了new ObjectMapper(),您还可以使用Json.mapper() 来获取Play 的全局映射器。
    • @JulianV.Modesto:你是对的。我会把它添加到答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多