杰克逊@JsonRawValue的地图价值

时间:2012-08-24 16:26:53

标签: java json jackson

我有以下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" }}}

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

2 个答案:

答案 0 :(得分:5)

正如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();
    }
}

答案 1 :(得分:2)

没有。您可以轻松创建自定义JsonSerializer来执行此操作。

另外,也许只使用一次性POJO:

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

public class Thing {
   public String name;
   public RawHolder content;
}