JSON Tree Model

JSON Tree Model

Jackson具有内置的树模型,可用于表示JSON对象。如果您不知道接收到的JSON的外观,或者由于某种原因而不能(或者只是不想)创建一个类来表示它,那么Jackson的树模型将非常有用。如果您需要在使用或转发JSON之前对其进行操作,则Jackson树模型也很有用。所有这些情况都可以在数据流场景中轻易发生。Jackson树模型由JsonNode类表示。您可以使用Jackson ObjectMapperJSON解析为JsonNode树模型,就像使用您自己的类一样。

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
ObjectMapper objectMapper = new ObjectMapper();
try {
    JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);
} catch (IOException e) {
    e.printStackTrace();
}

如您所见,只需将JsonNode.class作为第二个参数传递给readValue()方法,而不是本教程前面的示例中使用的Car.class,就可以将JSON字符串解析为JsonNode对象而不是Car对象。。

ObjectMapper类还具有一个特殊的readTree()方法,该方法始终返回JsonNode。这是使用ObjectMapper readTree()方法将JSON解析为JsonNode的示例:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
ObjectMapper objectMapper = new ObjectMapper();
try {
    JsonNode jsonNode = objectMapper.readTree(carJson);
} catch (IOException e) {
    e.printStackTrace();
}

通过JsonNode类,您可以以非常灵活和动态的方式将JSON作为Java对象进行导航。如前所述,JsonNode类在其自己的教程中进行了更详细的介绍,但是我仅在此处向您展示如何使用它的基础知识。

JSON解析为JsonNode(或JsonNode实例树)后,就可以浏览JsonNode树模型。这是一个JsonNode示例,显示了如何访问JSON字段,数组和嵌套对象:

String carJson =
        "{ \"brand\" : \"Mercedes\", \"doors\" : 5," +
        "  \"owners\" : [\"John\", \"Jack\", \"Jill\"]," +
        "  \"nestedObject\" : { \"field\" : \"value\" } }";

ObjectMapper objectMapper = new ObjectMapper();


try {

    JsonNode jsonNode = objectMapper.readValue(carJson, JsonNode.class);

    JsonNode brandNode = jsonNode.get("brand");
    String brand = brandNode.asText();
    System.out.println("brand = " + brand);

    JsonNode doorsNode = jsonNode.get("doors");
    int doors = doorsNode.asInt();
    System.out.println("doors = " + doors);

    JsonNode array = jsonNode.get("owners");
    JsonNode jsonNode = array.get(0);
    String john = jsonNode.asText();
    System.out.println("john  = " + john);

    JsonNode child = jsonNode.get("nestedObject");
    JsonNode childField = child.get("field");
    String field = childField.asText();
    System.out.println("field = " + field);

} catch (IOException e) {
    e.printStackTrace();
}

请注意,JSON字符串现在包含一个称为所有者的数组字段和一个称为nestedObject的嵌套对象字段。无论您访问的是字段,数组还是嵌套对象,都可以使用JsonNode类的get()方法。通过将字符串作为参数提供给get()方法,您可以访问JsonNode的字段。如果JsonNode表示数组,则需要将索引传递给get()方法。索引指定要获取的数组元素。

可以使用Jackson ObjectMapperJava对象转换为JsonNode,而JsonNode是转换后的Java对象的JSON表示形式。您可以通过Jackson ObjectMapper valueToTree()方法将Java对象转换为JsonNode。这是一个使用ObjectMapper valueToTree()方法将Java对象转换为JsonNode的示例:

ObjectMapper objectMapper = new ObjectMapper();
Car car = new Car();
car.brand = "Cadillac";
car.doors = 4;
JsonNode carJsonNode = objectMapper.valueToTree(car);

ObjectMapper objectMapper = new ObjectMapper();
String carJson = "{ \"brand\" : \"Mercedes\", \"doors\" : 5 }";
JsonNode carJsonNode = objectMapper.readTree(carJson);
Car car = objectMapper.treeToValue(carJsonNode);
下一页