Jackson-如何处理(反序列化)嵌套JSON?

{

vendors: [

{

vendor: {

id: 367,

name: "Kuhn-Pollich",

company_id: 1,

}

},

{

vendor: {

id: 374,

name: "Sawayn-Hermann",

company_id: 1,

}

}]

}

我有一个Vendor对象,可以从一个单独的“ vendor”

json序列中反序列化,但是我想将此序列反序列化为一个Vendor[],我只是想不出如何让Jackson合作。有小费吗?

回答:

您的数据存在问题,因为您的数组中有内部 包装

对象。想必你的Vendor对象被设计成手柄idnamecompany_id,但每次的多个对象也都包裹在一个对象与单一属性vendor

我假设您正在使用Jackson

数据绑定

模型。

如果是这样,那么有两件事要考虑:

第一种是使用特殊的Jackson配置属性。杰克逊-从1.9开始,我相信,如果您使用的是旧版杰克逊,则可能无法使用-

提供UNWRAP_ROOT_VALUE。它设计用于将结果包装在要丢弃的顶级单属性对象中的情况。

所以,玩一下:

objectMapper.configure(SerializationConfig.Feature.UNWRAP_ROOT_VALUE, true);

第二个是使用包装对象。即使丢弃了外部包装器对象,仍然存在将Vendor对象包装在单属性对象中的问题。使用包装器解决此问题:

class VendorWrapper

{

Vendor vendor;

// gettors, settors for vendor if you need them

}

同样,UNWRAP_ROOT_VALUES除了使用之外,您还可以定义一个包装器类来处理外部对象。假设你有正确的VendorVendorWrapper对象,你可以定义:

class VendorsWrapper

{

List<VendorWrapper> vendors = new ArrayList<VendorWrapper>();

// gettors, settors for vendors if you need them

}

// in your deserialization code:

ObjectMapper mapper = new ObjectMapper();

JsonNode rootNode = mapper.readValue(jsonInput, VendorsWrapper.class);

VendorsWrapper的对象树类似于您的JSON:

VendorsWrapper:

vendors:

[

VendorWrapper

vendor: Vendor,

VendorWrapper:

vendor: Vendor,

...

]

最后,您可以使用杰克逊 树模型

来解析到这一点JsonNodes,丢弃外侧的节点,并为每个JsonNodeArrayNode,要求:

mapper.readValue(node.get("vendor").getTextValue(), Vendor.class);

这样做可能会减少代码量,但看起来却不比使用两个包装程序笨拙。

以上是 Jackson-如何处理(反序列化)嵌套JSON? 的全部内容, 来源链接: utcz.com/qa/425217.html

回到顶部