【问题标题】:How to Serialise a JSON String to a JAVA Object using Jackson如何使用 Jackson 将 JSON 字符串序列化为 JAVA 对象
【发布时间】:2021-08-30 11:56:32
【问题描述】:

我在将以下 JSON 字符串反序列化为 Java 对象时遇到问题。

{
    "action": {
               "onWarning":{
                   "alert":{
                          "isEnabled": true,
                          "name": ""
                           }
                   },
               "onError":{
                 "alert":{
                        "isEnabled": true,
                        "name": ""
                        }
                   },
                "onSuccess":{
                 "alert":{
                        "isEnabled": true,
                        "name": ""
                        }
                   }
             }
}

下面的代码应该可以工作,但我认为我的问题在于我正在传递的映射器 -

ObjectMapper mapper = new ObjectMapper();
JobConfig lib = mapper.readValue(jsonString, JobConfig.class);
System.out.println(lib.action.onWarning.alert.isEnabled);

我通过它的映射器如下:

Alert.java

public class Alert{
    @JsonProperty("isEnabled")
    public boolean isEnabled;

    @JsonProperty("name")
    public String name;
}

AlertConfig.java

public class AlertConfig {
    
    @JsonProperty("onSuccess")
    public Alert onSuccess;

    @JsonProperty("onWarning")
    public Alert onWarning;

    @JsonProperty("onError")
    public Alert onError;
}

JobConfig.java

public class JobConfig {
    @JsonProperty("action")
    public AlertConfig action;
}

我得到的错误是:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "alert" (class com.test.dv.service.domain.Alert), not marked as ignorable (2 known properties: "name", "isEnabled"])

我不确定如何将警报 JSON 的内容命名为 alert,但它已经被命名为 Alert。

【问题讨论】:

  • 您在AlertConfig 之间缺少一个级别,该级别具有onSuccessAlert 之类的字段,而Alert 具有isEnabled。什么应该映射到两者之间的alert
  • 你可以引入包含Alert对象的AlertWrapper类,那么AlertConfig应该由AlertWrapper而不是Alert组成

标签: java json jackson


【解决方案1】:

错误是正确的,在您的 DTO 中,onError/Success/Warning 字段的类型为 Alert,警报类型有 nameisEnabled,您没有 json 中的 alert 字段

"onError":{
    "alert":{

您缺少具有 alert 属性的 DTO,而 onError/Success/Warning 应该属于该类型 (或从 json 中删除 alert 属性)

【讨论】:

  • 是的,您是对的,解决此问题的最佳方法是什么?我仍然想在我的 JSON 中有“警报”,所以我应该创建一个新的 DTO,但是我已经有了 Alert.java 会是什么样子
【解决方案2】:

您应该创建一个如下所示的 AlertWrapper 类 -

public class AlertWrapper {

    @JsonProperty("alert")
    public Alert alert;
}

并且您的 AlertConfig 类应该包含如下所示的 AlertWrapper -

public class AlertConfig {

    @JsonProperty("onSuccess")
    public AlertWrapper onSuccess;

    @JsonProperty("onWarning")
    public AlertWrapper onWarning;

    @JsonProperty("onError")
    public AlertWrapper onError;
}

这样做您将完成您的 DTO

【讨论】:

  • 谢谢,我现在明白了.. 这对我有用,但是我现在想知道这是否是实现这一目标的好方法?在 scala 中,我会在一个文件中创建所有案例类,但在 java 中,它会因为太多 POJO 而变得过于混乱
  • 可以有更好的方法来做到这一点,这也不是一个糟糕的方法来做你正在做的事情。人们尝试以不同的方式编写代码,并且每种方式都有其自己的优点。 Scala 肯定会提供更好的做事方式。
猜你喜欢
  • 2016-02-08
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2020-02-03
  • 2021-05-20
  • 1970-01-01
相关资源
最近更新 更多