【问题标题】:json jackson unusual map serializationjson jackson异常图序列化
【发布时间】:2015-11-19 07:14:04
【问题描述】:

假设,我有以下结构:

public class SomeClass {
private String id;
@JsonProperty("key-value")
private Map<String, Object> keyValue;}

显然会被序列化为

 {
   "id" : "id1", 
   "key-value" : 
    {"key1" : "value1",
    "key2 : "value2"}
 }

可以这样表示吗?

 {
   "id" : "id1", 
   "key1" : "value1",
   "key2 : "value2"
 }

提前致谢!

【问题讨论】:

  • 所以这里有新问题stackoverflow.com/questions/33799243/jsonanygetter-doesnt-work 我知道您对这个问题及其答案并不真正感兴趣??
  • @sharonbn,在您回答我之前,我曾尝试创建新问题。但是 stackoverflow 告诉我,只有 90 分钟后才能创建前一个。老实说,我不知道为什么会提出这个问题。您的解决方案工作正常。谢谢!
  • 也许 stackoverflow 设置 90 分钟限制是有原因的?无论如何,如果我的解决方案正常工作,请通过接受答案来显示应用程序。

标签: java json jackson


【解决方案1】:

在 Jackson 的自定义序列化器的帮助下,这是完全可能的:

  1. @JsonSerialize 注释添加到您的 POJO:

(还添加了必要的 ctor 和 getter)

@JsonSerialize(using = SomeClassSerializer.class)
public static class SomeClass {
    private String id;
    @JsonProperty("key-value")
    private Map<String, Object> keyValue;

    public SomeClass(String id, Map<String, Object> keyValue) {
        this.id = id;
        this.keyValue = keyValue;
    }
    public String getId() { return id; }
    public Map<String, Object> getKeyValue() { return keyValue; }
}
  1. 自定义序列化程序如下所示:

public class SomeClassSerializer extends JsonSerializer<SomeClass>
{
    @Override
    public void serialize(SomeClass sc, JsonGenerator gen, SerializerProvider serializers)
            throws IOException, JsonProcessingException
    {
        gen.writeStartObject();
        // write id propertry
        gen.writeStringField("id", sc.getId());   
        // loop on keyValue entries, write each as property
        for (Map.Entry<String, Object> keyValueEntry : sc.getKeyValue().entrySet()) {
            gen.writeObjectField(keyValueEntry.getKey(), keyValueEntry.getValue());
        }
        gen.writeEndObject();
    }
}
  1. 以通常的方式调用 Jackson 的映射器:

public static void main(String[] args)
{
    Map<String, Object> keyValue = new HashMap<>();
    keyValue.put("key1", "value1");
    keyValue.put("key2", "value2");
    keyValue.put("key3", new Integer(10));
    SomeClass sc = new SomeClass("id1", keyValue);

    try {
        new ObjectMapper().writeValue(System.out, sc);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

输出:

{"id":"id1","key1":"value1","key2":"value2","key3":10}

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多