【问题标题】:Jackson serialize list to xml & jsonJackson 将列表序列化为 xml 和 json
【发布时间】:2021-12-10 01:28:02
【问题描述】:

我有一个要序列化为 json 和 XML 的类:

@JacksonXmlRootElement(localName = "devices")
class DeviceWrapper { // <-- this class is intended to provide root xml name

    @JacksonXmlProperty(localName = "device")
    @JacksonXmlElementWrapper(useWrapping = false)
    List<Device> devices
}

设备类只是 POJO:

class Device {
  String field1;
  String field2;
  ...
}

将 DeviceWrapper 序列化为 XML 工作正常:

<?xml version="1.0"?>
<devices>
  <device>
    <field1>value</field1>
    <field2>value</field2>
  </device>
  <device>
    <field1>value</field1>
    <field2>value</field2>
  </device>
  ...
</devices>

但是当我尝试将 DeviceWrapper 序列化为 json 时,我得到:

{
  "devices": [
    {
      "field1": "val",
      "field2": "val"
    },
    {
      "field1": "val",
      "field2": "val"
    }
    ...
  ]
}

但我只想获取设备值列表:

[
  {
    "field1": "val",
    "field2": "val"
  },
  {
    "field1": "val",
    "field2": "val"
  },
        ...
]

即我想看到devices 仅用于 xml 作为列表的分组元素,并且不想在 json 的情况下看到它。怎么做?

【问题讨论】:

    标签: java json xml jackson jackson-dataformat-xml


    【解决方案1】:

    欢迎来到 Stack Overflow,使用 @JsonValue 注释注释您的 List&lt;Device&gt; devices 即可解决您的问题,但由于存在 xml 注释,这是不可能的:解决方法是使用 ObjectMapper#addMixIn方法。如果您定义如下接口:

    public class DeviceWrapperModelMixIn {
        @JsonValue
        List<Device> devices;
    }
    

    您可以将其添加到您的 objectmapper 并获得预期的结果,而无需更改原始类代码:

    mapper.addMixIn(DeviceWrapper.class, DeviceWrapperModelMixIn.class);
    //it prints [{"field1":"val","field2":"val"},{"field1":"val","field2":"val"}]
    System.out.println(mapper.writeValueAsString(wrapper));
    

    【讨论】:

      猜你喜欢
      • 2016-06-14
      • 2018-07-18
      • 2023-03-13
      • 2013-04-09
      • 1970-01-01
      • 2012-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      相关资源
      最近更新 更多