【问题标题】:Jackson XML Serialization - Remove Field TagsJackson XML 序列化 - 删除字段标签
【发布时间】:2020-11-23 19:16:51
【问题描述】:

我需要生成这个 XML:

<CRequest>
  <abc:Name>Smith</abc:Name>
  <abc:FirstName>John</abc:Surname>
  <abc:Age>12</abc:Age>
  <abc:Name>Jones</abc:Name>
  <abc:FirstName>Jake</abc:Surname>
  <abc:Age>10</abc:Age>
  <abc:Name>Johnson</abc:Name>
  <abc:FirstName>Paul</abc:Surname>
  <abc:Age>12</abc:Age>
</CRequest>

但是,我能做的最好的事情是:

<CRequest>
  <children>
    <abc:Name>Smith</abc:Name>
    <abc:FirstName>John</abc:Surname>
    <abc:Age>12</abc:Age>
  </children>
  <children>
    <abc:Name>Jones</abc:Name>
    <abc:FirstName>Jake</abc:Surname>
    <abc:Age>12</abc:Age>
  </children>
  <children>
    <abc:Name>Johnson</abc:Name>
    <abc:FirstName>Paul</abc:Surname>
    <abc:Age>12</abc:Age>
  </children>
</CRequest>

我有以下 Java 类:

@JsonRootName("CRequest")
@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
public class ChildrenRequest {

    @JacksonXmlElementWrapper(useWrapping = false)
    private List<Child> children= new ArrayList<>();
    ...

@XmlAccessorType(XmlAccessType.FIELD)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonPropertyOrder({"Name", "FirstName", "Age"})
public class Child{

    @JsonProperty("Name")
    @JacksonXmlProperty(localName = "abc:Name")
    private String name;

    @JsonProperty("Surname")
    @JacksonXmlProperty(localName = "FirstName")
    private String firstName;

    @JsonProperty("Age")
    @JacksonXmlProperty(localName = "abc:Age")
    private String age;
    ...

有没有办法去掉子标签?

PS:如果没有“useWrapping = false”,我会为每个孩子获得两个孩子标签。

【问题讨论】:

  • 不确定是否有 XML 等价物,但 JsonUnwrapped 注释对我来说可以在 JSON 中做同样的事情 - fasterxml.github.io/jackson-annotations/javadoc/2.8/com/…
  • 虽然老实说 useWrapping = false 听起来确实是一回事。想一想,我从来没有在对象列表上使用过它,只有在对象图中跳过一个级别时才使用它。我猜这个列表可能是问题,因为最终的 XML 看起来有点不标准

标签: java xml serialization jackson


【解决方案1】:

您需要为请求类实现自定义序列化器:

class ChildrenRequestJsonSerializer extends JsonSerializer<ChildrenRequest> {
    @Override
    public void serialize(ChildrenRequest value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        ToXmlGenerator xmlGen = (ToXmlGenerator) gen;
        writeStartObject(xmlGen);
        JsonSerializer<Object> childSerializer = serializers.findValueSerializer(Child.class).unwrappingSerializer(NameTransformer.NOP);
        for (Child child : value.getChildren()) {
            childSerializer.serialize(child, gen, serializers);
        }
        xmlGen.writeEndObject();
    }

    private void writeStartObject(ToXmlGenerator xmlGen) throws IOException {
        final XmlMapper mapper = (XmlMapper) xmlGen.getCodec();
        final PropertyName rootName = mapper.getSerializationConfig().findRootName(ChildrenRequest.class);

        xmlGen.setNextName(new QName("", rootName.getSimpleName()));
        xmlGen.writeStartObject();
    }
}

您可以按如下方式注册序列化器:

@JsonRootName("CRequest")
@JsonSerialize(using = ChildrenRequestJsonSerializer.class)
class ChildrenRequest

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-13
    • 2019-10-21
    • 2015-05-19
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    相关资源
    最近更新 更多