Jackson XML序列化 – 移除字段标签

huangapple go评论99阅读模式
英文:

Jackson XML Serialization - Remove Field Tags

问题

I need to generate this XML:

  1. <CRequest>
  2. <abc:Name>Smith</abc:Name>
  3. <abc:FirstName>John</abc:FirstName>
  4. <abc:Age>12</abc:Age>
  5. <abc:Name>Jones</abc:Name>
  6. <abc:FirstName>Jake</abc:FirstName>
  7. <abc:Age>10</abc:Age>
  8. <abc:Name>Johnson</abc:Name>
  9. <abc:FirstName>Paul</abc:FirstName>
  10. <abc:Age>12</abc:Age>
  11. </CRequest>

However, the best I could do was:

  1. <CRequest>
  2. <children>
  3. <abc:Name>Smith</abc:Name>
  4. <abc:FirstName>John</abc:FirstName>
  5. <abc:Age>12</abc:Age>
  6. </children>
  7. <children>
  8. <abc:Name>Jones</abc:Name>
  9. <abc:FirstName>Jake</abc:FirstName>
  10. <abc:Age>10</abc:Age>
  11. </children>
  12. <children>
  13. <abc:Name>Johnson</abc:Name>
  14. <abc:FirstName>Paul</abc:FirstName>
  15. <abc:Age>12</abc:Age>
  16. </children>
  17. </CRequest>

I have the following Java classes:

  1. @JsonRootName("CRequest")
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. @JsonInclude(JsonInclude.Include.NON_EMPTY)
  4. public class ChildrenRequest {
  5. @JacksonXmlElementWrapper(useWrapping = false)
  6. private List<Child> children = new ArrayList<>();
  7. ...

and

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @JsonInclude(JsonInclude.Include.NON_EMPTY)
  3. @JsonPropertyOrder({"Name", "FirstName", "Age"})
  4. public class Child {
  5. @JsonProperty("Name")
  6. @JacksonXmlProperty(localName = "abc:Name")
  7. private String name;
  8. @JsonProperty("Surname")
  9. @JacksonXmlProperty(localName = "abc:FirstName")
  10. private String firstName;
  11. @JsonProperty("Age")
  12. @JacksonXmlProperty(localName = "abc:Age")
  13. private String age;
  14. ...

Is there a way to get rid of the children tags?

PS: Without "useWrapping = false" I get two children tags for every child.

英文:

I need to generate this XML:

  1. &lt;CRequest&gt;
  2. &lt;abc:Name&gt;Smith&lt;/abc:Name&gt;
  3. &lt;abc:FirstName&gt;John&lt;/abc:Surname&gt;
  4. &lt;abc:Age&gt;12&lt;/abc:Age&gt;
  5. &lt;abc:Name&gt;Jones&lt;/abc:Name&gt;
  6. &lt;abc:FirstName&gt;Jake&lt;/abc:Surname&gt;
  7. &lt;abc:Age&gt;10&lt;/abc:Age&gt;
  8. &lt;abc:Name&gt;Johnson&lt;/abc:Name&gt;
  9. &lt;abc:FirstName&gt;Paul&lt;/abc:Surname&gt;
  10. &lt;abc:Age&gt;12&lt;/abc:Age&gt;
  11. &lt;/CRequest&gt;

However, the best I could do was:

  1. &lt;CRequest&gt;
  2. &lt;children&gt;
  3. &lt;abc:Name&gt;Smith&lt;/abc:Name&gt;
  4. &lt;abc:FirstName&gt;John&lt;/abc:Surname&gt;
  5. &lt;abc:Age&gt;12&lt;/abc:Age&gt;
  6. &lt;/children&gt;
  7. &lt;children&gt;
  8. &lt;abc:Name&gt;Jones&lt;/abc:Name&gt;
  9. &lt;abc:FirstName&gt;Jake&lt;/abc:Surname&gt;
  10. &lt;abc:Age&gt;12&lt;/abc:Age&gt;
  11. &lt;/children&gt;
  12. &lt;children&gt;
  13. &lt;abc:Name&gt;Johnson&lt;/abc:Name&gt;
  14. &lt;abc:FirstName&gt;Paul&lt;/abc:Surname&gt;
  15. &lt;abc:Age&gt;12&lt;/abc:Age&gt;
  16. &lt;/children&gt;
  17. &lt;/CRequest&gt;

I have the following Java classes:

  1. @JsonRootName(&quot;CRequest&quot;)
  2. @XmlAccessorType(XmlAccessType.FIELD)
  3. @JsonInclude(JsonInclude.Include.NON_EMPTY)
  4. public class ChildrenRequest {
  5. @JacksonXmlElementWrapper(useWrapping = false)
  6. private List&lt;Child&gt; children= new ArrayList&lt;&gt;();
  7. ...

and

  1. @XmlAccessorType(XmlAccessType.FIELD)
  2. @JsonInclude(JsonInclude.Include.NON_EMPTY)
  3. @JsonPropertyOrder({&quot;Name&quot;, &quot;FirstName&quot;, &quot;Age&quot;})
  4. public class Child{
  5. @JsonProperty(&quot;Name&quot;)
  6. @JacksonXmlProperty(localName = &quot;abc:Name&quot;)
  7. private String name;
  8. @JsonProperty(&quot;Surname&quot;)
  9. @JacksonXmlProperty(localName = &quot;FirstName&quot;)
  10. private String firstName;
  11. @JsonProperty(&quot;Age&quot;)
  12. @JacksonXmlProperty(localName = &quot;abc:Age&quot;)
  13. private String age;
  14. ...

Is there a way to get rid of the children tags?

PS: Without "useWrapping = false" I get two children tags for every child.

答案1

得分: 0

你需要实现请求类的自定义序列化器:

  1. class ChildrenRequestJsonSerializer extends JsonSerializer<ChildrenRequest> {
  2. @Override
  3. public void serialize(ChildrenRequest value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  4. ToXmlGenerator xmlGen = (ToXmlGenerator) gen;
  5. writeStartObject(xmlGen);
  6. JsonSerializer<Object> childSerializer = serializers.findValueSerializer(Child.class).unwrappingSerializer(NameTransformer.NOP);
  7. for (Child child : value.getChildren()) {
  8. childSerializer.serialize(child, gen, serializers);
  9. }
  10. xmlGen.writeEndObject();
  11. }
  12. private void writeStartObject(ToXmlGenerator xmlGen) throws IOException {
  13. final XmlMapper mapper = (XmlMapper) xmlGen.getCodec();
  14. final PropertyName rootName = mapper.getSerializationConfig().findRootName(ChildrenRequest.class);
  15. xmlGen.setNextName(new QName("", rootName.getSimpleName()));
  16. xmlGen.writeStartObject();
  17. }
  18. }

然后,你可以像下面这样注册序列化器:

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

请参考以下链接了解更多信息:

英文:

You need to implement custom serialiser for request class:

  1. class ChildrenRequestJsonSerializer extends JsonSerializer&lt;ChildrenRequest&gt; {
  2. @Override
  3. public void serialize(ChildrenRequest value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  4. ToXmlGenerator xmlGen = (ToXmlGenerator) gen;
  5. writeStartObject(xmlGen);
  6. JsonSerializer&lt;Object&gt; childSerializer = serializers.findValueSerializer(Child.class).unwrappingSerializer(NameTransformer.NOP);
  7. for (Child child : value.getChildren()) {
  8. childSerializer.serialize(child, gen, serializers);
  9. }
  10. xmlGen.writeEndObject();
  11. }
  12. private void writeStartObject(ToXmlGenerator xmlGen) throws IOException {
  13. final XmlMapper mapper = (XmlMapper) xmlGen.getCodec();
  14. final PropertyName rootName = mapper.getSerializationConfig().findRootName(ChildrenRequest.class);
  15. xmlGen.setNextName(new QName(&quot;&quot;, rootName.getSimpleName()));
  16. xmlGen.writeStartObject();
  17. }
  18. }

And you can register serialiser as below:

  1. @JsonRootName(&quot;CRequest&quot;)
  2. @JsonSerialize(using = ChildrenRequestJsonSerializer.class)
  3. class ChildrenRequest

See also:

huangapple
  • 本文由 发表于 2020年8月4日 01:28:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/63234236.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定