有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java XStream:NamedMapConverter和HashMap,不带容器节点

假设我有以下Java类:

@XStreamAlias("object")
public class MyObject {

    @XStreamAsAttribute
    private String name;

    private Map<String, String> description = new HashMap<>();

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public Map<String, String> getDescription() { return description; }
    public void setDescription(Map<String, String> description) { this.description = description; }
}

如何初始化XStream以将其转换为以下XML(并解析XML以创建Java对象):

<?xml version="1.0" ?>
<object name="test">
  <description language="en">Test en</description>
  <description language="fr">Test fr</description>
</object>

?

当然,我希望语言是我的描述映射的关键,节点值是映射值

我试过这个:

XStream xs = new XStream(new DomDriver());
xs.processAnnotations(MyObject.class);
xs.registerConverter(new NamedMapConverter(xs.getMapper(), "description", "language", String.class, null, String.class, true, false, xs.getConverterLookup()));

但我得到了以下结果:

<object name="name test">
  <description>
    <description language="en">Test en</description>
    <description language="fr">Test fr</description>
  </description>
</object>

我怎样才能去掉集装箱标签

编辑:我希望避免为整个MyObject类编写自定义转换器,因为真正的转换有点复杂,目前除了描述字段外,它没有自定义转换器。类似于名为dMapConverter的东西会很棒


共 (1) 个答案

  1. # 1 楼答案

    我不知道XStream,但你可以用SimpleXml来实现

    public final class Question4 {
    
        @XmlName("object")
        public static class MyObject {
            @XmlAttribute
            private String name = "test";
            @XmlMapWithAttributes(keyName = "language")
            private Map<String, String> description = new HashMap<>();
    
            private MyObject() {
                description.put("en", "Test en");
                description.put("fr", "Test fr");
            }
        }
    
        public static void main(final String... args) {
            XmlParser parser = new XmlParser();
            System.out.println(parser.toXml(new MyObject()));
        }
    
    }
    

    正如您所见,不需要配置解析器,只需将注释添加到字段中即可。输出如下:

    <object name="test">
      <description language="en">Test en</description>
      <description language="fr">Test fr</description>
    </object>
    

    <;?xml preample不会出现,但我相信如果确实需要的话,您可以自己添加它