6

次のJavaBeanクラスがあり、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のは、マップの値に対してのみ指定する方法です。これはジャクソンで可能ですか?

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。ただし、それを行うためのカスタムを簡単に作成できます。

また、多分、1回限りのPOJOを使用するだけです。

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

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