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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杰克逊:了解源JSON是数组还是对象相关的知识,希望对你有一定的参考价值。

在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)

什么是检查消息Body中是否有数组或对象的最佳方法,以便路由到正确的解析?是否只是直接检查邮件正文中的数组标记?

答案

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

这是一个足够常见的用例,有一个Jackson开关:

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

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

另一答案

如果您想知道输入是数组还是对象,可以使用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

以上是关于杰克逊:了解源JSON是数组还是对象的主要内容,如果未能解决你的问题,请参考以下文章

JSON 使用杰克逊库相同对象的字段,但在必要时打印不同的值

错误代码:错误域 = NSCocoaErrorDomain 代码 = 3840“JSON 文本没有以数组或对象和允许未设置片段的选项开头。”

Alamofire 文件上传出现错误“JSON 文本未以数组或对象开头,并且允许未设置片段的选项”

对象序列化到字节与杰克逊序列化从对象到 JSON?

如何使用骆驼杰克逊将 JSONArray 转换为对象列表

Java - 使用杰克逊将 json 转换为复杂对象