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

反序列化时忽略属性

崔恺
2023-03-14
问题内容

我有一个简单的接口与属性的getter和setter。

public interface HasMoney {

      Money getMoney();

      void setMoney(Money money);

 }

我还有另一个实现此接口的UserAccount类。

public class UserAccount implements HasMoney {

       private Money money;

       @Override
       Money getMoney() // fill in the blanks

       @Override
       void setMoney(Money money) // fill in the blanks

}

我的问题是我想序列化money属性,但在反序列化它时忽略它,即,不接受用户对此属性的任何值。我在setter上尝试过@JsonIgnore,在getter上尝试过@JsonIgnore(false),它确实会忽略它,但是在序列化它时也会这样做。

我在setter上尝试了@JsonIgnore,在getter上尝试了@JsonProperty,只是为了明确告诉Jackson我们打算跟踪此属性,当将money属性发送到服务器并且Jackson反序列化它并抛出MalformedJsonException时,这似乎使应用程序崩溃:无法构造Money类型的对象。

最奇怪的是,在属性为原始类型的大多数情况下,将@JsonIgnore放在设置器上,将@JsonProperty放在设置器上是可行的。


问题答案:

好的,因此@JsonIgnore的行为从1.9起已彻底更改(对于更糟糕的imo)。无需深入探讨为什么在反序列化期间不忽略您的媒体资源的荒唐细节,请尝试使用以下代码对其进行修复:

public class UserAccount implements HasMoney {
    @JsonIgnore
    private BigDecimal money;

    // Other variable declarations, constructors

    @Override
    @JsonProperty
    public BigDecimal getMoney() {
        return money;
    }

    @JsonIgnore
    @Override
    public void setMoney(final BigDecimal money) {
        this.money = money;
    }

    // Other getters/setters
}

注意在@JsonIgnore现场的使用-有效解决方案所必需的。

注意:根据您的环境和用例,您可能需要在ObjectMapper实例上进行其他配置,例如
USE_GETTERS_AS_SETTERS,AUTO_DETECT_GETTERS,AUTO_DETECT_SETTERS



 类似资料:
  • 问题内容: 我有一个简单的接口与属性的getter和setter。 我还有另一个实现此接口的UserAccount类。 我的问题是我想序列化money属性,但在反序列化它时忽略它,即,不接受用户对此属性的任何值。我在setter上尝试过@JsonIgnore,在getter上尝试过@JsonIgnore(false),它确实会忽略它,但是在序列化它时也会这样做。 我在setter上尝试了@Json

  • 问题内容: 在这个例子中 如果JSON对象缺少属性“ age”, 有人说它不能反序列化。在反序列化期间是否有 注释 可以忽略丢失的字段? 谢谢 问题答案: 我想你想要的是 这就是Jackson 1.x的方式。我认为2.x中有一种新方法。就像是 这些将告诉Jackson仅序列化不为null的值,并且在反序列化缺少的值时不会抱怨。我认为它将只是将其设置为Java默认值。

  • 我想在Java中反序列化包含空值的json字符串。我想将对象反序列化为对象。json字符串类似于: 当我反序列化使用 由于对象中的that,我得到一个空指针异常。我如何指示Gson忽略空值的反序列化?

  • 问题内容: 我使用以下代码来序列化从外部服务获得的响应,并作为我的服务的一部分返回json响应。但是,当外部服务返回带有时区(10:30:00.000-05.00)的时间值时,杰克逊会将其转换为15:30:00。如何忽略时区值? 问题答案: 您可以创建自定义解串器 告诉杰克逊使用您的自定义解串器 并像这样使用它: 您可以使用Jackson自定义序列化为服务响应添加时区信息

  • 问题内容: 我有一个用作调用RESTful Web服务的 模板 。这是通过解析器创建的,由于它被用作告诉用户端点模式的模板,因此我不得不想出一种保留所有属性的方法,这就是为什么将其默认值设置为的原因。作为示例,这是对象最初的外观: 然后,用户可以根据需要填写各个字段,例如和: 表示他们只关心这两个领域。现在,我想将此模板()序列化回一个JSON字符串,但只希望显示填充的那些字段。所以我尝试了这个:

  • 问题内容: 我正在使用Json.Net将类序列化和反序列化为json并返回。 我在标有(或)新的仅获取属性的类中添加了代码。结果如下: Newtonsoft.Json.JsonSerializationException:在JSON中找不到必需的属性 我以为标记该属性可以解决此问题,但这不起作用。 我如何告诉Json.Net应该忽略此属性? 这是重现此问题的最小示例: 问题答案: 显然,在这种情况