代码之家  ›  专栏  ›  技术社区  ›  asinkxcoswt

Jackson XML映射重复元素组

  •  0
  • asinkxcoswt  · 技术社区  · 6 年前

    使用Jackson,我必须创建一个可以封送到以下XML的java类

    <Root>
       <Key>key1</Key>
       <Value>value1</Value>
       <Key>key2</Key>
       <Value>value2</Value>
       ...
    </Root>
    

    Key Value 不正确。

    @JacksonXmlRootElement(localName = "Root")
    class Root {
        @JacksonXmlProperty(localName = "Key")
        private String[] keys;
        @JacksonXmlProperty(localName = "Value")
        private String[] values;
    }
    

    1 回复  |  直到 6 年前
        1
  •  0
  •   asinkxcoswt    6 年前

    我做到了!在自定义序列化程序的帮助下。

    首先,根元素:

    @JacksonXmlRootElement(localName = "Root")
    class Root {
        @JacksonXmlElementWrapper(useWrapping = false)
        private List<Wrapper> keyValueList;
        // getters, setters
    }
    

    Key Value 对:

    @JsonSerialize(using = WrapperSerializer.class)
    class Wrapper {
        private String key;
        private String value;
        // getters, setters, all args constructors
    }
    

    以及序列化程序:

    public class WrapperSerializer extends StdSerializer<Wrapper> {
        public WrapperSerializer() {
            this(Wrapper.class);
        }
    
        protected WrapperSerializer(Class<Wrapper> t) {
            super(t);
        }
    
        @Override
        public void serialize(Wrapper value, JsonGenerator gen, SerializerProvider provider) throws IOException {
            gen.writeRaw(new StringBuilder()
                    .append("<Key>")
                    .append(value.getKey())
                    .append("</Key>")
                    .append("<Value>")
                    .append(value.getValue())
                    .append("</Value>")
                    .toString());
        }
    }
    

    Root ref = new Root();
    ref.setKeyValueList(Arrays.asList(
            new Wrapper("k1", "v1"),
            new Wrapper("k2", "v2")));
    XmlMapper xmlMapper = new XmlMapper();
    String output = xmlMapper.writeValueAsString(ref);
    System.out.println(output);
    

    结果是:

    <Root><Key>k1</Key><Value>v1</Value><Key>k2</Key><Value>v2</Value></Root>