当前位置: 首页 > 面试题库 >

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

邹书
2023-03-14
问题内容
{
  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);

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



 类似资料:
  • 我知道我可以创建一个单独的Report类,然后使用@JSONProperty将其嵌入到ReportResponse中。有没有一种方法可以避免这种情况,并用一个注释标记ReportResponse类,将它映射到JSON中的“Report”元素?

  • 我正在创建一个具有嵌套列表的API。Jackson似乎是一个创建对象的好工具,但我不太清楚如何嵌套列表,我想知道这是否可能。 我的对象看起来像这样。 我希望有一种方法可以将其映射到json,看起来像: 我们希望能够做到这一点,以便我们可以将属性添加到列表中。

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中

  • 我正在尝试使用Jakson反序列化一个嵌套的多态类型。也就是说,我的顶级类型引用了另一个多态类型,该类型最终由不抽象的类扩展。这不起作用,它会抛出一个异常。 下面是我尝试做的一个简化的例子。 我得到了关于抽象类型的标准异常。 让我解释一下我的用例。我有一个描述数据工作流的Json文档。我在“Level One”有一个抽象类型,描述对单个值的操作。我派生了一堆不是抽象的类,它们实现了公共操作(我用@

  • 问题内容: 我的问题很简单:我有以下简单的类: 我正在尝试处理以下JSON: 显然,这里存在一个问题(“ blah”无法解析为int) 以前,Jackson抛出类似org.codehaus.jackson.map.JsonMappingException的内容:无法从字符串值’blah’构造java.lang.Integer的实例:不是有效的Integer值 我同意这一点,但是我想在某个地方注册一

  • 但它返回一个id为空且产品为空的对象。当然,我不需要为这个简单的操作编写自定义的吗?