【问题标题】:Jackson polymorphic deserialization on integer fields instead of strings整数字段而不是字符串的杰克逊多态反序列化
【发布时间】:2014-07-11 02:35:27
【问题描述】:

我熟悉正常的多态反序列化内容,您可以根据某个字段的字符串值反序列化对象。例如:

@JsonSubTypes(
          {
              @JsonSubTypes.Type(value = LionCage.class, name = "LION"),
              @JsonSubTypes.Type(value = TigerCage.class, name = "TIGER"),
          }
         )
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")

如果传入对象的“类型”字段是整数而不是字符串,有什么方法可以做基本相同的事情吗?所以在上面的例子中,“LION”和“TIGER”应该是 1 和 2。不管出于什么原因,我一直无法弄清楚。

另外,我应该如何解决这个问题?看起来应该很明显。

【问题讨论】:

  • 只要您的模型类使用字符串作为外部属性,整数就可以了。杰克逊很聪明,它似乎可以为您将整数转换为字符串。如果您对细节感兴趣,我在这里做了非常相似的事情:stackoverflow.com/questions/38501574/…

标签: java json jackson


【解决方案1】:

Jackson 自动将字符串转换为数字,反之亦然。只需对数字使用字符串值。像 "1" 一样,对于 1 值。自己试试吧(杰克逊版本是2.5.1):

import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.databind.ObjectMapper;

public class HelloWorldJacksonNumber {

    public static class A extends Base {
        String a;
    }

    public static class B extends Base {
        String b;
    }

    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
    @JsonSubTypes({
            @JsonSubTypes.Type(value = A.class, name = "1"),
            @JsonSubTypes.Type(value = B.class, name = "2")})
    public static class Base {
        int type;
    }

    public static void main (String[] args) throws Exception {
        final ObjectMapper objectMapper = new ObjectMapper();
        System.out.println(objectMapper.version());

        System.out.println(objectMapper.writeValueAsString(new A()));
        System.out.println(objectMapper.writeValueAsString(new B()));

        System.out.println(objectMapper.readValue("{\"type\":\"1\"}", Base.class).getClass());
        System.out.println(objectMapper.readValue("{\"type\":\"2\"}", Base.class).getClass());
    }
}

输出是:

2.5.1
{"type":"1"}
{"type":"2"}
class HelloWorldJacksonNumber$A
class HelloWorldJacksonNumber$B

【讨论】:

    【解决方案2】:

    不,这不是通过注释的选项。 TypeIdResolver 接口接受并返回字符串。您可以使用 Jackson 的流 API 使用自定义解析器/序列化器来完成此操作,但将其切换到数字字段似乎需要做很多工作。如果其他人的系统需要它,我只会这样做。如果我拥有整个东西,我会使用您在问题中发布的设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-10
      • 2023-03-04
      相关资源
      最近更新 更多