如何使用注释在 jackson 的反序列化过程中强制执行ACCEPT_SINGLE_VALUE_AS_ARRAY

2022-09-01 12:27:54

有没有办法在要在其中使用的类中的 List 属性上使用批注?我正在使用Spring并得到以下异常ACCEPT_SINGLE_VALUE_AS_ARRAYJackson

nested exception is com.fasterxml.jackson.databind.JsonMappingException: can canreservalize instance of java.util.ArrayList out of VALUE_STRING token

假设我有一个如下类:

public class MyClass {

    private List < String > value;
}

我的JSON结构如下:

案例1:

[{"operator": "in", "value": ["Active"], "property": "status"}]

案例2:

[{"operator": "like", "value": "aba", "property": "desc"}]

我应该使用什么注释来让框架知道我希望在反序列化时对这两种情况的处理方式相同。

更新:为了更清晰,我将更新移到了这篇文章中的答案。


答案 1

您可以使用@JsonFormat注释,

public class MyClass {

    @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
    private List<String> value;

}

要使用它,您需要拥有 杰克逊版本 。您还可以使用其他可用的 JsonFormat 功能min 2.7.0

对于版本 2.6.x

@Autowired private ObjectMapper mapper;
//...

mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);
  • 将此代码添加到 .Initializer Class
  • 或者您可以直接在JacksonBean Configuration

这些将解决问题,但它将被激活为每个进程。deserialization


答案 2

为了清楚起见,我只是在回答我自己的问题。其中一个答案是升级到更高版本,以便我可以使用注释。由于我的项目的依赖性限制,我无法做到这一点。

因此,基于Michal Foksa的答案,我通过创建自定义反序列化程序解决了我的问题。其如下:

在我的财产上:

@JsonDeserialize(using = CustomStringDeserializer.class)
private List<String> value;

我的反序列化器:

public class CustomStringDeserializer extends JsonDeserializer<List<String>>{

    @Override
    public List<String> deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(DeserializationFeature. ACCEPT_SINGLE_VALUE_AS_ARRAY);
        return mapper.readValue(p, List.class);
    }

}