【问题标题】:Deserialize embedded JSON-String as typed Object将嵌入的 JSON-String 反序列化为类型化对象
【发布时间】:2019-12-08 14:25:54
【问题描述】:

将这些赋予模型(为简单起见,使用 Lombok @Data)

@Data
public class RootModel {
    private Integer myRootProperty;
    private SubModel mySubModel;
}

@Data
public class SubModel {
    private Integer mySubProperty
}

还有这个 JSON 字符串:

{
    "myRootProperty" : 5,
    "mySubModel" : "{ "mySubProperty" : 3 }"
}

是否可以(通过 Jackson-Annotations)将嵌入的 JSON-String(源自 DB-Column)直接反序列化为其 Java-POJO-Model?

背景是我们需要在我们的数据库中使用 JSON 格式的配置,我想尽快处理它的类型安全 - 最好在反序列化之后直接处理。

【问题讨论】:

  • 如果没有那些引号被转义,那不是有效的 JSON。

标签: java json spring-boot jackson json-deserialization


【解决方案1】:

是的,确实如此。只需使用@JsonProperty 标签进行注释

@Data
public class RootModel {
    @JsonProperty("myRootProperty")
    private Integer myRootProperty;

    @JsonProperty("mySubModel")
    private SubModel mySubModel;
}

@Data
public class SubModel {
    @JsonProperty("mySubProperty")
    private Integer mySubProperty
}

然后使用对象映射器反序列化成POJO

RootModel rootModel = objectMapper.readValue(jsonString, RootModel.class);

【讨论】:

  • 如果我这样做,我会得到一个异常:原因:com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造SubModel 的实例(尽管至少存在一个创建者):否从字符串值反序列化的字符串参数构造函数/工厂方法 ('{"mySubProperty": 3}') 请注意 JSON 作为字符串嵌入到 Input-Json - 我想我需要类似“Json-String-子模型中的“构造函数”(或类似的)...
  • 哦,对,这是 Jackson vs Lombok 的事情,Lombok 正在创建一个构造函数,该构造函数影响 Jackson 使用默认构造函数的方式。看看这个答案:stackoverflow.com/questions/39381474/…,这些策略中可能有一些可行
【解决方案2】:

问题在于您的Json 字符串。如果你看看你的Json

{
    "myRootProperty" : 5,
    "mySubModel" : "{ "mySubProperty" : 3 }"
}

子节点包含在"" 中,就像"{ "mySubProperty" : 3 }" 一样,因为它是value。 相反,如果您的Json 如下所示(注意:我只删除了双引号),例如{ "mySubProperty" : 3 },反序列化将不再抱怨。您的典型 Json 字符串如下所示。

{
    "myRootProperty" : 5,
    "mySubModel" : { "mySubProperty" : 3 }
}

【讨论】:

  • 这实际上是问题的一部分——一个包含 JSON 结构的字符串值。
  • 您不能更改 JSON?我不关注
【解决方案3】:

不,没有自动化的方法可以做到这一点。您可以尝试自定义反序列化器。否则将其读取为字符串并在另一步骤中将其转换为类型化对象。

【讨论】:

  • 后者是我目前的解决方案——它是这样工作的,但我希望我可以避免这个额外的步骤。
猜你喜欢
  • 2016-02-17
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多