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

Jackson:如何防止字段序列化(同时保持反序列化)

郭元明
2023-03-14

我想进一步说明这个问题是关于什么的,我已经漫游了一个小时了,但没有找到任何东西。

public class Foo {

    /* This is the property I want to be instanciated by Jackson upon deserialization
     * but not serialized upon serialization
     */
    private final Object bar = null;

    public Object getBar() {
        return bar;
    }
}

更糟糕的是,正如您所看到的,该属性是final(这就是为什么我热衷于通过反序列化在foo实例化时使用Jackson反射能力)。我已经阅读了关于以不同的方式注释setter和getter的潜在解决方案,但如果可能的话,我希望将此属性保留为最终属性。如果不可能,我会接受一个非最终财产。

我希望答案不建议自定义序列化/反序列化,我的代码库目前是免费的,如果解决方案的影响最小,那将是完美的。再说一遍,我不是杰克逊的专家,所以如果我问的是不可能的,我显然会接受其他答案。

我也在github上读过这篇文章,但目前没有一种建议的实现方式真正实现。

编辑:使事情更清楚

public class Foo {

    private final String bar = null;

    public String getBar() {
        return bar;
    }

    @Override
    public String toString() {
        return bar;
    }
}


public void testMethod() throws IOException {
        String html" target="_blank">json = "{\"bar\":\"Value\"}";
        ObjectMapper mapper = new ObjectMapper();
        Foo foo = mapper.readValue(json, Foo.class);
        System.out.println(foo); // should have a bar property set to "Value"
        System.out.println(mapper.writeValueAsString(foo)); // should return an empty JSON object
}

共有1个答案

缑兴贤
2023-03-14

我不确定它是否是优雅的解决方案,但你可以使用MixIn功能。您必须创建如下所示的新接口:

interface FooMixIn {

    @JsonIgnore
    String getBar();
}

假设您的POJO如下所示:

class Foo {

    private final String bar = null;

    public String getBar() {
        return bar;
    }

    @Override
    public String toString() {
        return bar;
    }
}

现在您必须告诉Jackson您希望忽略此属性:

String json = "{\"bar\":\"Value\"}";
System.out.println(json);
ObjectMapper deserializeMapper = new ObjectMapper();
deserializeMapper.addMixInAnnotations(Foo.class, FooMixIn.class);
System.out.println(deserializeMapper.readValue(json, Foo.class));
{"bar":"Value"}
null
{"bar":"Value"}
Value

如果您想获得如您所示的结果,您必须创建两个ObjectMapper自定义它们。参见下面的示例:

String json = "{\"bar\":\"Value\"}";
ObjectMapper deserializerMapper = new ObjectMapper();
Foo foo = deserializerMapper.readValue(json, Foo.class);
System.out.println("Foo object: " + foo);

ObjectMapper serializerMapper = new ObjectMapper();
serializerMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
serializerMapper.addMixInAnnotations(Foo.class, FooMixIn.class);
System.out.println("JSON: " + serializerMapper.writeValueAsString(foo));

对于序列化,您必须使用一个实例,对于反序列化,您必须使用另一个实例。

 类似资料:
  • 我有这样一门课: 我知道基于typeToClassId的对象obj是什么类型,不幸的是只有在运行时才知道。 我想基于typeToClassId解析出obj——这里最好的方法是什么?注释似乎已经过时了,基于ObjectMapper的东西似乎是对的,但我很难弄清楚最好的方法可能是什么。 类似于类clazz=lookUpClassBasedOnId(typeToClassId)objectMapper的

  • 这是一个关于Jackson2.3的问题,我不可能更改到其他框架。 我想使用Jackson2.3将对象序列化到json。一些对象来自实现特定(外部)接口的第三方库。我想实现的是防止那些对象中的某些字段被序列化。我没有修改这个类的权限,所以@jsonIgnore不会删除它。下面是一个例子 (我不认为有一个叫做Some_Serializer_That_Can_Ignore_Password的东西,我想要

  • 我有以下xml 我需要将其反序列化为以下POJO: 这里的问题是被包装在元素中

  • 问题内容: 好像生成带有对象的随机分布字段的JSON代码。有办法解决字段顺序问题吗? 字符串jsonRequest可以是: (正确) (顺序错误) 问题答案: 如果GSON不支持字段顺序的定义,那么其他库也可以。例如,Jackson允许使用@JsonPropertyOrder进行定义。对我来说,必须指定自己的自定义序列化程序似乎很繁琐。 是的,我同意按照JSON规范,应用程序不应期望字段的特定顺序

  • 问题内容: 我有一个具有以下结构的JSON有效负载… …映射到以下类: 目前,如果用户提交的浮点值,则将忽略小数,并且仅接受整数部分。我想要做的是防止用户提交带有浮动值的有效负载(请参见下文)并引发异常(类似于“第8列第5行的“年龄”字段的JSON值无效”),这是标准做法反序列化失败时出现错误消息)。 我正在考虑为数字值实现自定义反序列化器,但想知道是否有更简单的方法来实现此目的。 问题答案: 在

  • 我的Spring Boot API使用camelCase,但我需要通过我的API将一些请求代理到使用snake_case的第三方API。是否可以将Jackson配置为从snake_case反序列化第三方响应,然后将其序列化回camelCase到我的前端? 所需功能的逐步示例: 示例对象: 我调用我的API API调用第三方 第三方返回 我的API将其反序列化为 我的API序列化对象并返回 现在我使