当前位置: 首页 > 知识库问答 >
问题:

在jackson 2.8中,如何对类Foo的每个反序列化值进行后处理?

融宏伟
2023-03-14

我正在使用jackson构建一个rest服务,其中有一个ObjectMapper实例,我可以在其中设置我的配置。Java的值是pojos,具有String和int等类型的字段。很简单,情况直白,没什么特别的。

我想在反序列化后对给定类型的每个字段执行一些处理,可能会更改应该放在pojo字段中的值。我不想在POJO中乱扔注释或任何东西,它应该在ObjectMapper中是独立的。我也不想覆盖现有的反序列化代码——数据映射本身应该保持原样。

具体示例:假设我想对每个传入字符串调用toUpperCase(),因为我不喜欢小写字母。我如何创造这种行为?我希望能找到如下的东西,但它似乎不存在:

objectMapper。getDeserializationConfig()。registerValueProcessor(Foo.class,Foo::bar)

我对jackson的基本知识很熟悉,比如注册一个新的类型(反)序列化程序,我只是对这种特殊类型的东西一无所知。


共有2个答案

夏侯航
2023-03-14

我想最好的办法是编写我自己的(去)序列化器impl,它使用继承或组合来包裹现有的(去)序列化器,并在对象映射器配置中替换它。这样,我可以调用原始转换逻辑(通过超级或字段),并对其返回的结果进行后处理。

瞿宏儒
2023-03-14

具体示例:假设我想对每个传入的字符串调用toUpperCase(),因为我不喜欢小写字母。我如何创造这种行为?

字符串创建自定义反序列化程序:

SimpleModule module = new SimpleModule("customDeserializers", Version.unknownVersion());
module.addDeserializer(String.class, new StdDeserializer<String>(String.class) {

    @Override
    public String deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        return jp.getValueAsString().toUpperCase();
    }
});

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

上面定义的自定义反序列化程序将只处理映射到字符串的值。例如,如果给定的POJO有一个类型为UUID的成员,则该值不会转换为大写。请参见下面的示例

public class Person {

    private UUID id;

    private String name;

    // Getters and setters
}
String json = "{\"id\": \"6d39b716-ee80-4468-b1e4-b4270d57be99\", \"name\": \"Joe Doe\"}";
Person person = mapper.readValue(json, Person.class);

System.out.println(person.getId());   // Prints 6d39b716-ee80-4468-b1e4-b4270d57be99
System.out.println(person.getName()); // Prints JOE DOE

 类似资料:
  • 我试图实现HL7 FHIR规范的断言,即表示FHIR模型的JSON将不会有空对象或空数组。为了不让我的消费者的生活变得更加艰难,我在反序列化过程中没有严格执行这一点,但我想确保我的库生成的序列化JSON符合规定。我正在使用Java和Jackson ObjectMapper将对象序列化为JSON。我对编写自定义序列化程序的理解是,对象在某一点上表示为JsonNode,而不管转换为什么。 我想做的是在

  • 我在Spring Kafka设置中使用Avro和模式注册表。 我想以某种方式处理,它可能在反序列化过程中引发。 我找到了以下两个资源: https://github.com/spring-projects/spring-kafka/issues/164 有人知道如何在Spring Boot中捕获吗? 我使用的是Spring Boot 2.0.2 编辑:我找到了解决办法。

  • 问题内容: 我整天都在寻找可以解决这个问题的东西,但是到目前为止我还没有碰到很多运气。 我的问题很简单:如何使用Jackson正确反序列化匿名对象。 在出现异常之前,此输出为:JSON = [“ com.foo.test.JacksonTest $ 1”,{“ value”:5}]: 线程“主”中的异常com.fasterxml.jackson.databind.JsonMappingExcept

  • 我有一个简单的JSON语句,类型非常适合需要。像这样 或 我使用POJO类映射这个json字符串和pojo类代码是给bleow 我正在使用jaxb和jakson。我正在实现webservice来处理json语句,所以我使用bean类来映射json。但是当我使用映射这个json时,它会给出以下异常 org.codehaus.jackson.map.JsonMappingExcture:名称为"mbo

  • 来自REST服务的json对象 使用JacksonInFiveMinutes中的代码 ObjectMapper mapper=new ObjectMapper(); Map userData=mapper.read值(webResource.queryParams(queryParams). get(String.class);, Map.class); 在哪里: 从REST服务返回json 从J

  • 我们有以下Json: 我们需要根据type属性将这些项以多态方式反序列化为不同的子类。 在自定义Jackson反序列化程序中是否可以获取类型值? 我们可以使用提供给反序列化方法的JsonParser安全地回溯Json树吗? 我发现了这篇关于多态反序列化的博客,但它似乎需要在项目本身上设置一个type属性。 谢谢