在JAXB中自定义HashMap的编组<string,object>

时间:2018-01-08 12:11:13

标签: java xml jaxb moxy payara

关于通过JAXB进行编组,我遇到了一个小问题。

目前我有一个对象的HashMap

@XmlJavaTypeAdapter(HashMapAdapter.class)
private Map<String, Object> data;
由自定义HashMapAdapter编组的

public class HashMapAdapter extends XmlAdapter<HashMapAdapter.AdaptedMap, 
Map<String, Object>> {

@XmlRootElement
public static class AdaptedMap {

    @XmlVariableNode("key")
    List<Data> entries = new ArrayList<>();
}

public static class Data {

    @XmlTransient
    public String key;

    @XmlValue
    public Object value;

}

@Override
public Map<String, Object> unmarshal(AdaptedMap v) throws Exception {
    throw new NotImplementedException();
}

@Override
public AdaptedMap marshal(Map<String, Object> map) throws Exception {
    AdaptedMap adaptedMap = new AdaptedMap();
    for (Map.Entry<String, Object> entry : map.entrySet()) {
        Data data = new Data();
        data.key = entry.getKey();
        data.value = entry.getValue();
        adaptedMap.entries.add(data);
    }
    return adaptedMap;
}
}

编组基于以下帖子:http://blog.bdoughan.com/2013/06/moxys-xmlvariablenode-using-maps-key-as.html

HashMap填充了布尔值,长值或字符串值。

因此,关于博客,预期的JSON输出应为:

"data": {
    "booleanValue": true,
    "stringValue": "test",
    "longValue": 1234
}

但真正的结果是:

"data": {
    "longValue": {
        "type": "long",
        "value": 1234
    },
    "stringValue": {
        "type": "string",
        "value": "test"
    },
    "booleanValue": {
        "type": "boolean",
        "value": true
    }
}

我在Payara Micro 174上运行,因此在MOXy上作为JAXB提供商运行。

是否有可能摆脱“类型”/“值”嵌套?

最好的问候

西蒙

1 个答案:

答案 0 :(得分:0)

我没有MOxY实现方便,你能尝试一下并告诉我它是否有效吗?

public static class Data {

    @XmlTransient
    public String key;

    @XmlElements({
        @XmlElement(type=Long.class),
        @XmlElement(type=String.class),
        @XmlElement(type=Boolean.class)
    })
    @XmlPath(".")
    public Object value;

}

编辑:

使用此方法时获得的输出是:

"data": {
    "stringValue": {
        "value": test
    },
    "booleanValue": {
        "value": true
    },
    "longValue": {
        "value": 1234
    }
}

可悲的是,这与预期略有不同。