【问题标题】:Convert Object with hasmap to XML using Jackson使用 Jackson 将带有 hashmap 的对象转换为 XML
【发布时间】:2016-09-23 02:48:01
【问题描述】:

我有一个只包含一个 hasmap 类型属性的对象。

public class Application {

    private Map<String,Object> map2;

    public Map<String, Object> getMap2() {
        return Collections.unmodifiableMap(map2);
    }

    public void setMap2(Map<String, Object> map2) {
        this.map2 = map2;
    }
}

我尝试使用 Jackson 生成 XML:

Map<String,Object> map = new HashMap<String, Object>();
map.put("key1", "value1");
map.put("key2", "value2");

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.configure( ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true );
System.out.println(xmlMapper.writeValueAsString(app));

结果是:

<?xml version='1.0' encoding='UTF-8'?>
<Application>
    <Map2>
        <key1>value1</key1>
        <key2>value2</key2>
    </Map2>
</Application>

但我只想拥有:

<?xml version='1.0' encoding='UTF-8'?>
<Application>
    <key1>value1</key1>
    <key2>value2</key2>
</Application>

如何删除 Map2 元素?

【问题讨论】:

    标签: java xml jackson


    【解决方案1】:

    使用 HashMap 而不是整个类。喜欢

    public class AppDao {
    
        private Map<String,Object> Application;
    
        public Map<String, Object> getMap2() {
            return Collections.unmodifiableMap(map2);
        }
    
        public void setMap2(Map<String, Object> Application) {
        this.Application = Application;
        }
        public Map<String,Object> getMap2(){
            return Application;
        }
    }
    

    现在使用 hashmap 生成 XML

    xmlMapper.configure( ToXmlGenerator.Feature.WRITE_XML_DECLARATION, true );
    System.out.println(xmlMapper.writeValueAsString(app.getMap2()));
    

    【讨论】:

    • 我已经尝试过这个解决方案。如果我使用 HashMap 而不是我获得的整个对象: value1value2哈希表>。那么我怎样才能将 HashMap 重命名为 Application 呢?
    • 好吧,我创建了一个扩展 HashMap 类的新类 Application。现在没事了。但解决方案并不真正“干净”!
    • @gduh 你要求的并不是真正的“干净”
    【解决方案2】:

    我认为最好的选择是在getMap2() 上方使用@JsonAnyGetter 注释。是的,它是 json 注释,但你必须将它用于 xml 和 json https://github.com/FasterXML/jackson-dataformat-xml#additional-annotations

    public static class Application {
    
        private Map<String,Object> map2;
    
        @JsonAnyGetter
        public Map<String, Object> getMap2() {
            return Collections.unmodifiableMap(map2);
        }
    
        public void setMap2(Map<String, Object> map2) {
            this.map2 = map2;
        }
    
        // if you need deserialization
        @JsonAnySetter
        public void setMap2(String key, Object value) {
            map2.put(key, value);
        }
    }
    

    第二个选项(如果你可以改变你的结构)是使用

    public static class Application extends HashMap<String,Object> {}
    
    // or if you want to change map class name:
    @JsonRootName("Application")
    public static class MyMap  extends HashMap<String,Object>{}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-17
      • 2017-08-31
      • 2023-02-05
      • 2019-06-24
      • 2017-01-16
      • 1970-01-01
      • 2010-10-21
      • 2013-03-25
      相关资源
      最近更新 更多