【问题标题】:Jackson: avoid deserialization of some fields but not ignoring themJackson:避免对某些字段进行反序列化,但不要忽略它们
【发布时间】:2017-04-07 15:51:09
【问题描述】:

我需要携带所有 json 数据(存储、记录、返回),但我永远不会从代码中访问它们。有什么方法可以避免反序列化它们但在序列化过程中仍然使用它们?

class MyObject {    
  int importantField; // i want this field to be properly deserialized
  String notImportantJsonGarbage; // i don't care what's here. it must be a valid json
}

所以现在我希望能够反序列化它

{"importantField":7, "notImportantJsonGarbage":{"key1":3, "key2":[1,2,3]}}

稍后将其序列化为相同的字符串

更新

我不想忽略这个属性。我需要这些数据。但作为一个字符串,不是完全反序列化的对象

我需要能够做到:

json1 -> object -> json2
json1 == json2

【问题讨论】:

  • 您是否尝试过使用我在回答中提到的 JSONObject 类型?我认为这可以解决您的问题。您可以将其读取到 json 对象并仅在需要时对其进行反序列化。
  • This answer 在另一个反序列化问题上可能会有所帮助。

标签: java json jackson


【解决方案1】:

看看:JsonProperty.Access

  • AUTO - 访问设置,这意味着可见性规则将用于自动确定读取和/或写入访问权限 这个属性。

  • READ_ONLY - 访问设置,这意味着该属性只能在序列化时读取,而在
    期间不能写入(设置) 反序列化。

  • READ_WRITE - 访问设置,这意味着将访问属性以进行序列化(将值写为 外部表示)和反序列化(从
    读取值 外部表示),无论可见性规则如何。

  • WRITE_ONLY - 访问设置,这意味着该属性只能被写入(设置)用于反序列化,但不会被读取 (get) 关于序列化,即属性的值不是 包含在序列化中。

所以在你的情况下,你可以这样使用它:

@JsonProperty(access = Access.READ_ONLY)
private String notImportantJsonGarbage;

【讨论】:

  • 但是这样notImportantJsonGarbagenull。因此缺少信息,我的要求后来将其序列化为相同的字符串没有满足
  • 这适用于简单的字段类型,但根据我的经验,不适用于集合或列表等字段。
【解决方案2】:

您可以在要忽略的属性上使用注解@JsonIgnore

【讨论】:

    【解决方案3】:

    Json 字段可以使用 JSONObject 类型。

    private JSONObject notImportantJsonGarbage;
    

    当您需要阅读时,您可以将其转换为字符串(或其他类型)。您可以使用 jacksongson 库来实现。

    请注意,当您将 JsonObject 转换回 String 时,生成的字符串可能会转义引号。

    使用 JSONObject 还可以解决您“必须是有效的 json 对象”的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-21
      • 2020-09-16
      • 1970-01-01
      • 2012-02-01
      • 1970-01-01
      • 2017-02-15
      • 1970-01-01
      相关资源
      最近更新 更多