使用 Jackson 将不同类型反序列化为单个字段

Bud*_*dha 2 java json jackson json-deserialization

我有一个以下类,我想用它来反序列化 JSON

public interface MyObject {

    @JsonProperty("prop")
    String prop;

    @JsonProperty("value")
    Double value();        // Need this to be either a double or a string or a Map
}
Run Code Online (Sandbox Code Playgroud)

但是,我希望能够用双值解析 JSON

{
  prop: "myprop",
  value: 15.7
}
Run Code Online (Sandbox Code Playgroud)

和具有非 Double 值的 JSON,如字符串或地图

{
  prop: "myprop1",
  value: {
    "attr1": "value1",
    "attr2": 12.0
  }
}
Run Code Online (Sandbox Code Playgroud)

我查看了@JsonSubTypes注释,但这看起来只对涉及继承的情况有用。可以在杰克逊做吗?如果是这样,我如何定义我的 Java 类来实现相同的目标?

Arv*_*ise 5

一般来说,我不鼓励使用任意类型的数据点。拥有强类型会带来很多好处,如果您愿意,我可以谈论这些好处。但是,由于您只讨论了反序列化,因此您可能只是在阅读其他人生成的此类 JSON。

解决方案很简单:使用 Object 字段。

public static class MyObject {

    @JsonProperty("prop")
    String prop;

    @JsonProperty("value")
    Object value;        // <- object
}

@Test
public void testUnknownType() throws JsonProcessingException {
    final ObjectMapper objectMapper = new ObjectMapper();
    final MyObject object1 = objectMapper.readValue("{\n" +
        "  \"prop\": \"myprop\",\n" +
        "  \"value\": 15.7\n" +
        "}", MyObject.class);
    Assert.assertEquals(15.7d, object1.value);
    final MyObject object2 = objectMapper.readValue("{\n" +
        "  \"prop\": \"myprop1\",\n" +
        "  \"value\": {\n" +
        "    \"attr1\": \"value1\",\n" +
        "    \"attr2\": 12.0\n" +
        "  }\n" +
        "}", MyObject.class);
    Assert.assertTrue(object2.value instanceof Map);
}
Run Code Online (Sandbox Code Playgroud)