有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javajackson将列表序列化为xml和json

我有一个要序列化为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作为列表的分组元素,而不想在json的情况下看到它。如何做到这一点


共 (1) 个答案

  1. # 1 楼答案

    欢迎使用Stack Overflow,用^{}注释List<Device> devices可以解决您的问题,但由于存在xml注释,这是不可能的:解决问题的一种方法是使用^{}方法。如果定义如下所示的接口:

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