How can I include raw JSON in an object using Jackson? How can I include raw JSON in an object using Jackson? java java

How can I include raw JSON in an object using Jackson?


@JsonRawValue is intended for serialization-side only, since the reverse direction is a bit trickier to handle. In effect it was added to allow injecting pre-encoded content.

I guess it would be possible to add support for reverse, although that would be quite awkward: content will have to be parsed, and then re-written back to "raw" form, which may or may not be the same (since character quoting may differ).This for general case. But perhaps it would make sense for some subset of problems.

But I think a work-around for your specific case would be to specify type as 'java.lang.Object', since this should work ok: for serialization, String will be output as is, and for deserialization, it will be deserialized as a Map. Actually you might want to have separate getter/setter if so; getter would return String for serialization (and needs @JsonRawValue); and setter would take either Map or Object. You could re-encode it to a String if that makes sense.


Following @StaxMan answer, I've made the following works like a charm:

public class Pojo {  Object json;  @JsonRawValue  public String getJson() {    // default raw value: null or "[]"    return json == null ? null : json.toString();  }  public void setJson(JsonNode node) {    this.json = node;  }}

And, to be faithful to the initial question, here is the working test:

public class PojoTest {  ObjectMapper mapper = new ObjectMapper();  @Test  public void test() throws IOException {    Pojo pojo = new Pojo("{\"foo\":18}");    String output = mapper.writeValueAsString(pojo);    assertThat(output).isEqualTo("{\"json\":{\"foo\":18}}");    Pojo deserialized = mapper.readValue(output, Pojo.class);    assertThat(deserialized.json.toString()).isEqualTo("{\"foo\":18}");    // deserialized.json == {"foo":18}  }}


I was able to do this with a custom deserializer (cut and pasted from here)

package etc;import java.io.IOException;import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.core.TreeNode;import com.fasterxml.jackson.databind.DeserializationContext;import com.fasterxml.jackson.databind.JsonDeserializer;/** * Keeps json value as json, does not try to deserialize it * @author roytruelove * */public class KeepAsJsonDeserialzier extends JsonDeserializer<String> {    @Override    public String deserialize(JsonParser jp, DeserializationContext ctxt)            throws IOException, JsonProcessingException {        TreeNode tree = jp.getCodec().readTree(jp);        return tree.toString();    }}