当前位置: 首页 > 面试题库 >

如何使用注释在杰克逊的反序列化过程中强制执行A​​CCEPT_SINGLE_VALUE_AS_ARRAY

公孙棋
2023-03-14
问题内容

有没有一种方法来使用注释在类中的列表属性使用ACCEPT_SINGLE_VALUE_AS_ARRAYJackson?我正在使用Spring并得到以下异常

嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:无法从VALUE_STRING令牌中反序列化java.util.ArrayList的实例

假设我有一个如下课程:

public class MyClass {

    private List < String > value;
}

我的JSON结构如下:

情况1:

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

情况2:

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

在反序列化时,我应该使用什么注释来使框架知道我希望这两种情况被视为相同。

更新: 为了使内容更加清晰,我将更新内容移到了本文的答案中。


问题答案:

为了清楚起见,我只是在回答自己的问题。答案之一是升级到更高版本,以便我可以使用注释。由于项目的依赖关系限制,我无法执行此操作。

结果,基于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);
    }

}


 类似资料:
  • 问题内容: 我正在用json主体调用aws lambda。因此json的字段与POJO中的字段名称不同。所以我要做的是在字段上添加@JsonProperty来告诉杰克逊json中的名字是什么。但是由于某种原因,它似乎无法识别它们,并且所有字段均为空。如果我传递一个具有与POJO相同的字段名称的json,那么它将起作用。这是我的课: 如果我通过 所有字段均为null,并且具有distinctId,u

  • 问题内容: 我想在使用Jackson时定义我的自定义序列化策略(要包括的字段)。我知道,我可以使用视图/过滤器来做到这一点,但是它引入了非常不好的一件事- 使用字段名称的字符串表示形式,这会自动导致自动重构出现问题。 如何迫使Jackson序列化仅带注释的属性,仅此而已? 问题答案: 如果禁用所有自动检测,则应仅序列化已注释的属性-无论是属性本身还是吸气剂。这是一个简单的例子:

  • 我正在尝试使用杰克逊将 JSON 对象反序列化为 Java 对象。json 是由另一位开发人员使用 jackson 库本身创建的,并提供给我。对象图有一个类型为guava的不可变映射的变量,它是一个抽象类。因此,当我尝试反序列化时,杰克逊会给我抛出以下异常。我不是 myJava 类的所有者,因此无法对其进行任何更改,例如通过编写自定义反序列化程序来更改类型或添加注释。 org.codehaus.j

  • 问题内容: 我想要的示例代码: 问题答案: 使用Jackson Kotlin Module 当前版本,如果您导入完整的模块包或特定的扩展功能,则将提供所有扩展方法。如: 因此,用于Kotlin的Jackson模块将推断出正确的类型,并且您不需要实例。 因此,您的情况(稍微重命名并修复了数据类和JSON): 您也可以使用以下形式: 如果没有导入,则会出现错误,因为找不到扩展功能。

  • 我明白它无法从嵌套JSON反序列化字符串。我解决这个问题的一个方法是通过编写自定义映射器 但是只要pojo中有变化,这就需要修改映射器,添加/删除字段。Mixin工作时没有任何变化,我该如何更新我的Mixin来处理objectId呢?

  • 我想用scala中的jackson反序列化json json_结构: {“type”:“struct”,“fields”:[{“name”:“code_role”,“type”:“string”,“nullable”:true,“metadata”:{“HIVE_type_string”:“string”},{“name”:“libelle_role”,“type”:“string”,“nulla