【问题标题】:Correct Jackson way to get the text value of a JsonNode获取 JsonNode 文本值的正确杰克逊方法
【发布时间】:2026-02-07 03:05:02
【问题描述】:

我看到人们使用toString() 来获取JsonNode 的文本值,当它是ObjectNode 而不是ValueNode 时,尤其是当某些节点的内容也是JSON 字符串时;我们可以构造另一个 JsonNode 来更深入地遍历内部树。

JsonNode shippingInfo = null;
JsonNode brand = null;
ArrayNode included = (ArrayNode)details.get("included");
for (JsonNode node: included) {
    if ("offers".equals(node.get("type").asText()) &&
                    orderOffer.getOfferId().toString().equals(node.get("id").asText())) {  // asText() will return empty string "", because it is not ValueNode.
    shippingInfo = node.get("attributes").get("shippingSellerMethod");
    } else if ("brands".equals(node.get("type").asText())) {
        brand = node.get("attributes");
    }
}

我知道它有用但丑陋。我想知道是否还有另一种杰克逊式的方式来获得价值,并不总是get(node_name).toString()

【问题讨论】:

  • “不,没有。”也算作有效答案。

标签: java json jackson jackson-databind


【解决方案1】:

您可以将 JSOn 读作Map

var map = new ObjectMapper().readValue(json, Map.class);
for (var node : ((Map<String, List<Map<String, Object>>>) map).get("included")) {
    if ("offers".equals(node.get("type")) && orderOffer.getOfferId().equals(node.get("id"))) {
        shippingInfo = ((Map<String, String>)node.get("attributes")).get("shippingSellerMethod");
    }
}

另一种方法是将您的数据描述为类:

class InputData {
    @JsonProperty
    List<Details> included;
}

class Details {
    @JsonProperty
    int id;
    @JsonProperty
    String type;
    @JsonProperty
    Map<String, Object> attributes;
}

并按以下方式阅读:

var parsed = mapper.readValue(json, InputData.class);
for (Details details : parsed.included) {
    if (details.type.equals("offers") && details.id == 1) {
        shippingInfo = details.attributes.get("shippingSellerMethod")
    }
}

接下来是使用JsonTypeInfoJsonSubTypes 注释。

【讨论】: