Java映射到JSON {“key”:“value”,“key1”:“value1”}为“key”:value,“key1”:“value1”使用Jackson

时间:2017-04-05 14:50:01

标签: java java-8 jackson

我有一个带有Map

的Sample pojo
class Sample {
  private Integer id;
  private String name;
  private Map<String,Object> map;
  public Map<String,Object> getMap() {
    return map;
  }
  public void setMap(Map<String, Object> map) {
    this.map = map;
  }
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

当我使用Jackson将此POJO写为JSON时,我得到以下结果。

{
  "id" : 1234,
  "name" : "abc",
  "map" : {
    "key1" : {
       "field" : "value",
       "field1" : "value"
    },
    "key2" : [
       {
          "something" : "a",
          "somethingElse" : 1
       },
       {
          "something" : "b",
          "somethingElse" : 2
       }
    ]
  }
}

虽然我想把这张地图写成

{
  "id" : 1234,
  "name" : "abc",
  "key1" : {
       "field" : "value",
       "field1" : "value"
  },
  "key2" : [
     {
        "something" : "a",
        "somethingElse" : 1
     },
     {
        "something" : "b",
        "somethingElse" : 2
     }
  ]
}

有没有办法在没有使用自定义序列化器的情况下使用?

1 个答案:

答案 0 :(得分:2)

如果您可以使用杰克逊,那么以下代码可以帮助您:

class Sample {

  private Map<String,Object> map = new HashMap<>();
  @JsonAnyGetter
  public Map<String,Object> getMap() {
    return this.map;
  }
  public void setMap(Map<String, Object> map) {
    this.map = map;
  }
  @JsonAnySetter
  public void addValue(String key, Object value) {
    this.map.put(key, value);
  }
}

在这种情况下,对于所有未知字段,这将按其键存储(或获取)值。