java - 将 XML 键值映射转换为 JSON 对象

标签 java json jackson

我当前有一个对象,它是一个键值对,我已使用 JAXB 将其从 XSD 转换为 POJO,并且我尝试使用 Jackson 2.x 获取 POJO 的 JSON 输出。此 JSON 输出如下所示:

[ { “键”:“键1”, “值”:1 }, { “键”:“键2”, “值”:“2” }, { “键”:“键3”, “值(value)” : [ ] }]

目前我的 XSD 生成的 POJO 如下所示:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "MapEntryType", propOrder = {
"value"
})
public class MapEntryType {
    @XmlElement(required = true)
    protected Object value;
    @XmlAttribute(name = "key", required = true)
    protected String key;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "mapEntries"
})
@XmlRootElement(name = "EventsSearchResponse")
public class EventsSearchResponse {
    @XmlElement(name = "MapEntry")
    protected List<MapEntryType> mapEntries;
}

我想将 map 生成为简单的 JSON 对象:

{ "key1" : 1, "key2" : "2", "key3" : []}

我查看了 Jackson 中可用的注释 http://wiki.fasterxml.com/JacksonAnnotations但我一直无法找到执行这种类型转换的方法。任何有关这方面的帮助将非常感激!谢谢。

最佳答案

我能够使用自定义序列化器实现所需的结果(为了方便起见,编写为内部类):

public static class EventsSearchResponseSerializer extends JsonSerializer<EventsSearchResponse>
{
    @Override
    public void serialize(EventsSearchResponse res, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException
    {
        gen.writeStartObject();

        for (MapEntryType t : res.mapEntries) {
            gen.writeObjectField(t.key, t.value);
        }
        gen.writeEndObject();
    }
}

向 POJO 添加了正确的注释:

@JsonSerialize(using = EventsSearchResponseSerializer.class)
@XmlRootElement(name = "EventsSearchResponse")
public static class EventsSearchResponse {
    @XmlElement(name = "MapEntry")
    public List<MapEntryType> mapEntries; 
}

调用 Jackson 映射器:

public static void main(String[] args)
{
    EventsSearchResponse r = new EventsSearchResponse();
    r.mapEntries = new ArrayList<>();
    MapEntryType t = new MapEntryType();
    t.key = "key1";
    t.value = new Integer(1);
    r.mapEntries.add(t);
    t = new MapEntryType();
    t.key = "key2";
    t.value = new Integer(2);
    r.mapEntries.add(t);
    t = new MapEntryType();
    t.key = "key2";
    t.value = new String[0];
    r.mapEntries.add(t);

    try {
        System.out.println(new ObjectMapper().writeValueAsString(r));
    } catch (Exception e) {
        e.printStackTrace();
    }
}

给出结果:

{"key1":1,"key2":2,"key2":[]}

关于java - 将 XML 键值映射转换为 JSON 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33746656/

相关文章:

java - 无法将 java.util.ArrayList 的实例反序列化出 VALUE_STRING

Java UDP 服务器,并发客户端

c++ - 为什么 nlohmann/json 在 double 上序列化 "null"而不是 "0"?

java - 如何将 Java 日历对象的 JSON 表示传递给 REST 服务?

java - Jackson:从 JSON 数组中获取没有 id 的单个值

java.lang.IndexOutOfBoundsException : index=3 out of bounds (limit=6, nb=4)

java/tomcat虚拟主机

c# - Json.Net 序列化/反序列化类名称属性 C#

php - 绘制从 JSON php 导入到 Highcharts 的多个系列

java - 使用 jackson 反序列化包含 @JsonFormat(shape=JsonFormat.Shape.ARRAY) 和自定义对象的 json