杰克逊:接受任何json的财产

时间:2016-07-29 04:43:32

标签: java json jackson

我有一个pojo:

public class A {

  public int a;
  public String anyJson1;
  public String anyJson2;
  public String anyJson3;
}

我希望anyJsonX字段接受任何json。例如:

{"a":5, "anyJson1":[1,2,3], "anyJson2:4, "anyJson3":{"c":"d"}}

我试图将@JsonRawValue放在这些字段上,但没有成功

  

嵌套异常是com.fasterxml.jackson.databind.JsonMappingException:无法从START_OBJECT标记中反序列化java.lang.String的实例

1 个答案:

答案 0 :(得分:6)

@JsonRawValue仅适用于序列化。

如果你可以将字符串字段更改为对象,你会没事的。

如果你不能,你可以使用一个简单的自定义反序列化器:

public class AnythingToString extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        TreeNode tree = jp.getCodec().readTree(jp);
        return tree.toString();
    }
}

然后在你的模型中使用它:

public static class A {

    public A() {}

    private int a;
    @JsonDeserialize(using = AnythingToString.class)
    private String anyJson1;
    @JsonDeserialize(using = AnythingToString.class)
    private String anyJson2;
    @JsonDeserialize(using = AnythingToString.class)
    private String anyJson3;