杰克逊:了解源JSON是数组还是对象

时间:2018-06-01 09:32:27

标签: java json jackson deserialization

在Jackson库中解析JSON需要:

  • 对象

    MapType hashMapType = typeFactory.constructMapType(HashMap.class, String.class, Object.class);
    Map<String, Object> receivedMessageObject =  objectMapper.readValue(messageBody, hashMapType);
    
  • 表示对象数组

    Map[] receivedMessage = objectMapper.readValue(messageBody, HashMap[].class)
    

在messageBody中检查我是否有数组或对象的最佳方法是什么,以便路由到正确的解析?是否只是直接检查MessageBody中的数组令牌?

3 个答案:

答案 0 :(得分:3)

如果您想知道输入是数组还是对象,可以使用readTree方法。一个简单的例子:

ObjectMapper mapper = new ObjectMapper();

String json1 = "{\"key\": \"value\"}";
String json2 = "[\"key1\", \"key2\"]";

JsonNode tree1 = mapper.readTree(json1);
System.out.println(tree1.isArray());
System.out.println(tree1.isObject());

JsonNode tree2 = mapper.readTree(json2);
System.out.println(tree2.isArray());
System.out.println(tree2.isObject());

如果您希望能够反序列化为多种类型,请查看Polymorphic Deserialization

答案 1 :(得分:1)

选项只是将可能是数组的所有内容视为数组。如果您的源JSON刚刚从XML自动转换或者使用像Jettison这样的XML优先库创建,这通常是最方便的。

这是一个足够常见的用例,杰克逊有这样的转换:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

然后,您可以将属性反序列化为集合类型,无论它是源JSON中的数组还是对象。

答案 2 :(得分:0)

这是我根据@ryanp 的回答所做的:

public class JsonDataHandler {
    public List<MyBeanClass> createJsonObjectList(String jsonString) throws JsonMappingException, JsonProcessingException {
        ObjectMapper objMapper = new ObjectMapper();
        objMapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
        List<MyBeanClass> jsonObjectList = objMapper.readValue(jsonString, new TypeReference<List<MyBeanClass>>(){});
        return jsonObjectList;
    }
}