Джексон XML Сериализация - Удалить теги полей - PullRequest
1 голос
/ 03 августа 2020

Мне нужно сгенерировать это 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" я получаю два дочерних тега для каждого ребенок.

1 Ответ

0 голосов
/ 04 августа 2020

Вам необходимо реализовать собственный сериализатор для класса запроса:

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

См. Также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...