Jackson将字符串字段解析为列表字段

2j4z5cfb  于 2022-11-08  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个类,其中有一个String字段,但现在我将其更改为List<String>

public TestClass{
// String field; was
List<String> field; // now
}

但问题是我已经在数据库中有一些数据了。我把这个类作为json保存到db中,当我需要检索它的时候,我正在解析它。但是现在它失败了,错误是因为它不能把单个String(以前是这样的)解析成List<String>(现在是这样的)。我能以某种方式改变这个行为吗?
现在我是这样分析的:

public <T> T parse(String s, Class<T> clazz) { // clazz is TestClass.class, String is json from DB
        try {
            return objectMapper.readValue(s, clazz); // objectMapper is ObjectMapper
        } catch (JsonProcessingException e) {
            ...
        }
    }

但是很明显,我的数据库中有两种类型的字段(旧的和新的),我能以某种方式将一个字符串解析为列表,但它也应该将列表解析为列表吗?

guicsvcw

guicsvcw1#

最简单的方法可能是使用如下注解对TestClass中的字段field进行注解:

public TestClass{
  @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
  List<String> field;
}

或者,如果无法将注解添加到字段中,则可以在对象Map器上启用它,方法是:

objectMapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
0x6upsns

0x6upsns2#

修改数据模型时解决此问题的正确方法是创建一个SQL脚本,将数据库中的所有现有值转换为新模型。
我知道支持同一个字段的两个版本是非常糟糕的做法。想象得更远一点。下次当你改变这个字段时,你会怎么做?

P.S.如果您仍然希望按自己的方式进行操作,则必须创建自定义反序列化器。请参阅此主题:Baeldung - Deserialization in Jackson 的最大值

相关问题