6

我有以下 Java bean 类,使用 Jackson 将其转换为 JSON。

  public class Thing {
    public String name;

    @JsonRawValue
    public Map content = new HashMap();
  }

content是一张地图,其值将是来自另一个来源的原始 JSON。例如:

String jsonFromElsewhere = "{ \"foo\": \"bar\" }";

Thing t = new Thing();
t.name = "test";
t.content.put("1", jsonFromElsewhere);

所需生成的 JSON 是:

{"name":"test","content":{"1":{ "foo": "bar" }}}

但是使用@JsonRawValue结果:

{"name":"test","content":{1={ "foo": "bar" }}}

我需要的是一种@JsonRawValue仅指定 Map 值的方法。杰克逊有可能吗?

4

2 回答 2

6

正如 StaxMan 指出的那样,实现自定义JsonSerializer.

public class Thing {
    public String name;

    @JsonSerialize(using=MySerializer.class)
    public Map<String, String> content = new HashMap<String, String>();
}

public class MySerializer extends JsonSerializer<Map<String, String>> {
    public void serialize(Map<String, String> value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeStartObject();
        for (Map.Entry<String, String> e: value.entrySet()) {
            jgen.writeFieldName(e.getKey());
            // Write value as raw data, since it's already JSON text
            jgen.writeRawValue(e.getValue());
        }
        jgen.writeEndObject();
    }
}
于 2012-08-24T21:22:29.420 回答
2

不,你可以很容易地创建自定义JsonSerializer来做到这一点。

此外,也许宁愿只使用一次性 POJO:

public class RawHolder {
   @JsonProperty("1")
   public String raw;
}

public class Thing {
   public String name;
   public RawHolder content;
}
于 2012-08-24T18:47:54.650 回答