使用 Jackson 在 java 中使用不同的 POJO 反序列化 JSON 数组
Deserialize JSON Array with different POJOs in java with Jackson
如何反序列化此 JSON 结构?
[
{
"page": 1,
"per_page": "50"
},
[
{
"id": "IC.BUS.EASE.XQ",
"name": "ion"
},
{
"id": "OIUPOIUPOIU",
"name": "lal alalalal"
}
]
]
(我从世界银行 Api 那里得到了这个,它有点简化,您找到的确切响应 here )。
问题是,我得到了一个对象数组,其中第一个元素是一个 POJO,第二个元素是一个特定类型的 POJO 数组。
我发现反序列化的唯一方法是非常通用,这会产生列表和地图。
List<Object> indicators = mapper.readValue(jsonString, new TypeReference<List<Object>>() {});
有没有更好的方法反序列化此 JSON 以获得数组或列表,其中第一个元素是对象 "A",第二个是对象列表 "B" ?
如果我是你,我会做这样的事情。如果不使用公共基础 class,就不可能在 java 上的一个列表中很好地表示您的数据。不幸的是,您的情况是 Object
。不过,您可以通过操纵响应列表来提供一些帮助。
ArrayNode arrayNode = (ArrayNode) mapper.readTree(this.getScrape().getScrapetext());
A a = mapper.readValue(arrayNode.get(0), A.class);
arrayNode.remove(0);
List<B> b = mapper.readValue(arrayNode.toString(), new TypeReference<List<B>>()
{
});
鉴于该结构相当不规则,因为没有 Java class 定义在结构上匹配 JSON 数组,该数组具有索引元素的魔术类型定义,您可能需要进行 2-pass 绑定。
首先,您将 JSON 绑定到 List
(或只是 Object
)或 JsonNode
。
从那里,您可以使用 ObjectMapper.convertValue()
提取元素并将其转换为您想要的实际类型。类似于:
JsonNode root = mapper.readTree(jsonSource);
HeaderInfo header = mapper.convertValue(jsonSource.get(0),
HeaderInfo.class);
IdNamePair[] stuff = mapper.convertValue(jsonSource.get(1),
IdNamePair[].class);
会让您从原始 JSON 数组中获取键入的值。
如何反序列化此 JSON 结构?
[
{
"page": 1,
"per_page": "50"
},
[
{
"id": "IC.BUS.EASE.XQ",
"name": "ion"
},
{
"id": "OIUPOIUPOIU",
"name": "lal alalalal"
}
]
]
(我从世界银行 Api 那里得到了这个,它有点简化,您找到的确切响应 here )。
问题是,我得到了一个对象数组,其中第一个元素是一个 POJO,第二个元素是一个特定类型的 POJO 数组。
我发现反序列化的唯一方法是非常通用,这会产生列表和地图。
List<Object> indicators = mapper.readValue(jsonString, new TypeReference<List<Object>>() {});
有没有更好的方法反序列化此 JSON 以获得数组或列表,其中第一个元素是对象 "A",第二个是对象列表 "B" ?
如果我是你,我会做这样的事情。如果不使用公共基础 class,就不可能在 java 上的一个列表中很好地表示您的数据。不幸的是,您的情况是 Object
。不过,您可以通过操纵响应列表来提供一些帮助。
ArrayNode arrayNode = (ArrayNode) mapper.readTree(this.getScrape().getScrapetext());
A a = mapper.readValue(arrayNode.get(0), A.class);
arrayNode.remove(0);
List<B> b = mapper.readValue(arrayNode.toString(), new TypeReference<List<B>>()
{
});
鉴于该结构相当不规则,因为没有 Java class 定义在结构上匹配 JSON 数组,该数组具有索引元素的魔术类型定义,您可能需要进行 2-pass 绑定。
首先,您将 JSON 绑定到 List
(或只是 Object
)或 JsonNode
。
从那里,您可以使用 ObjectMapper.convertValue()
提取元素并将其转换为您想要的实际类型。类似于:
JsonNode root = mapper.readTree(jsonSource);
HeaderInfo header = mapper.convertValue(jsonSource.get(0),
HeaderInfo.class);
IdNamePair[] stuff = mapper.convertValue(jsonSource.get(1),
IdNamePair[].class);
会让您从原始 JSON 数组中获取键入的值。