【问题标题】:XStream converter for converting comma separated values to a list用于将逗号分隔值转换为列表的 XStream 转换器
【发布时间】:2014-05-02 11:22:12
【问题描述】:

XStream 转换器,用于将逗号分隔的值转换为列表。

如何为以下代码编写转换器:

<foo> 
 <defaultValues>A,B,C</defaultValues> 
</foo>

我想将逗号分隔的值放入包含三个元素 A、B 和 C 的列表中。

我参考了以下链接,但没有得到所需的输出。 XStream converter for XMLList (similar to Jaxb)

谢谢 比什努

【问题讨论】:

    标签: xstream


    【解决方案1】:

    这是一个针对Foo 拥有自己的Converter 的解决方案。我希望有一个更简单的版本,可以为此配置CollectionsConverter

    转换器:

    public final class FooConverter implements Converter {
        private final Mapper mapper;
    
        // XStream can invoke this parametrized constructor
        public FooConverter(final Mapper mapper) {
            this.mapper = mapper;
        }
    
        @Override
        public boolean canConvert(@SuppressWarnings("rawtypes") final Class type) {
            return Foo.class.isAssignableFrom(type);
        }
    
        @Override
        public void marshal(Object source, HierarchicalStreamWriter writer,
                MarshallingContext context) {
            final Foo foo = (Foo) source;
            // Needed if there is a alias for this member
            String name = mapper.serializedMember(Foo.class, "defaultValues");
            writer.startNode(name);
            writer.setValue(marshalDefaultValues(foo));
            writer.endNode();
        }
    
        private String marshalDefaultValues(final Foo foo) {
            final StringBuffer commaSeparatedList = new StringBuffer();
            for (Iterator<Character> it = foo.getDefaultValues().iterator(); it
                    .hasNext();) {
                final char item = it.next();
                commaSeparatedList.append(item);
                if (it.hasNext()) {
                    commaSeparatedList.append(',');
                }
            }
    
            return commaSeparatedList.toString();
        }
    
        @Override
        public Object unmarshal(HierarchicalStreamReader reader,
                UnmarshallingContext context) {
            final Foo foo = new Foo();
    
            reader.moveDown();
            // Needed if there is a alias for this member
            String name = mapper.serializedMember(Foo.class, "defaultValues");
            if (name.equals(reader.getNodeName())) {
                final String commaSeparatedList = reader.getValue().trim();
                if (!commaSeparatedList.isEmpty()) {
                    final Stream<String> splitted = Arrays
                            .stream(commaSeparatedList.split("\\s*,\\s*"));
                    splitted.map(s -> s.charAt(0)).forEach(c -> {
                        foo.addDefaultValue(c);
                    });
                }
            } else {
                throw new ConversionException("Expected " + name + ", but was "
                        + name);
            }
            reader.moveUp();
    
            return foo;
        }
    }
    

    数据模型:

    @XStreamAlias("foo")
    @XStreamConverter(FooConverter.class)
    public final class Foo {
        private final List<Character> defaultValues = new ArrayList<>();
    
        public void addDefaultValue(char c) {
            defaultValues.add(c);
        }
    
        public List<Character> getDefaultValues() {
            return Collections.unmodifiableList(defaultValues);
        }
    }
    

    测试序列化和反序列化:

    public static void main(String[] args) {
        final Foo foo1 = new Foo();
        foo1.addDefaultValue('A');
        foo1.addDefaultValue('B');
        foo1.addDefaultValue('C');
    
        final XStream xstream = new XStream();
        xstream.autodetectAnnotations(true);
        final String xml = xstream.toXML(foo1);
        System.out.println(xml);
    
        final Foo foo2 = (Foo) xstream.fromXML(xml);
        for (final char c : foo2.getDefaultValues()) {
            System.out.println(c);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-06
      • 2017-06-04
      • 1970-01-01
      • 2020-04-07
      相关资源
      最近更新 更多