【问题标题】:Can not get Java object from JSON string(with inner arrays)无法从 JSON 字符串获取 Java 对象(带有内部数组)
【发布时间】:2017-11-29 06:30:50
【问题描述】:

我正在尝试从具有内部数组的 JSON 字符串中获取 Java 对象,有几乎相同的问题,但没有一个无法解决我的问题。现在在控制台中我得到 MethodPackage.JsonDeserialize@6580cfdd (我正在使用 objectmapper) 我的目标是在 json 中分别获取值来做一些操作

下面是我的完整代码:

JSONstring:
{
"status": 1,
"message": "ok",
"sheduleCod": "NOST_A_Persons_m_noaccum",
"algorithms": [{
    "cod": "No_st_alg_1",
    "kcp": "U6000427",
    "dtBeg": "2017-11-01 00:00:00",
    "dtEnd": "2017-12-01 00:00:00"
}, {
    "cod": "No_st_alg_2",
    "kcp": "U6000427",
    "dtBeg": "2017-11-01 00:00:00",
    "dtEnd": "2017-12-01 00:00:00"
}, {
    "cod": "No_st_alg_3",
    "kcp": "U6000427",
    "dtBeg": "2017-11-01 00:00:00",
    "dtEnd": "2017-12-01 00:00:00"
}]
}

          Main.class

String jsonString = response.toString();
JsonDeserialize deserialize = objectMapper.readValue(jsonString, JsonDeserialize.class);
System.out.println(deserialize);}

JsonDeserialize.class 
public class JsonDeserialize {
private String status;
private String message;
private String sheduleCod;
private List<Algorithm> algorithms;

            in JsonDeserialize.class 

public class JsonDeserialize {
private String status;
private String message;
private String sheduleCod;
private List<Algorithm> algorithms;
public JsonDeserialize(String status, String message, String sheduleCod, List<Algorithm> algorithms) {
    this.status = status;
    this.message = message;
    this.sheduleCod = sheduleCod;
    this.algorithms = algorithms;
}

..... and then getters and setters

                  Algorithm.class

public class Algorithm {
private String cod;
private String kcp;
private String dtBeg;
private String dtEnd;

public Algorithm(String cod, String kcp, String dtBeg, String dtEnd) {
    this.cod = cod;
    this.kcp = kcp;
    this.dtBeg = dtBeg;
    this.dtEnd = dtEnd;
}
public Algorithm () {

}

【问题讨论】:

    标签: java json objectmapper


    【解决方案1】:

    输出MethodPackage.JsonDeserialize@6580cfdd 表示您打印的是引用而不是对象的值。

    要解决此问题,请重写 JsonDeserialize 类中的 toString 方法,如下所示:

    @Override
    public String toString() {
        String values = ""; // you could also use a StringBuilder here
        values += "Status: " + status + "\n";
        values += "Message: " + message + "\n";
        // ....
        return values;
    }
    

    或使用:

    System.out.println(deserialize.getStatus())
    System.out.println(deserialize.getMessage());
    // ...
    

    【讨论】:

    • 从 [getStatus()] 我在控制台中得到 [1],即使我现在不使用 getter,我如何覆盖 [toString]?
    【解决方案2】:

    如果您使用的是 Jackson 或 GS​​ON,您只需创建与数据结构匹配的 POJO,它就会自动运行。此外,在这些 pojo 中,您可以使属性的名称与 JSON 的名称完全相同,或者使用 jackson 注释让您为每个对象属性提供 JSON 属性名称。但主要是我没有看到你展示的 POJOS 的任何 getter 和 setter,而且很可能你确实需要这些。请注意使用正确的“bean 命名”约定来命名属性。

    【讨论】:

    • 好的。我做了吸气剂和二传手。但是当我尝试获取值时,它显示为 NULL(例如 JsonDeserialize j = new JsonDeserialize(); System.out.println(j.getSheduleCod());),对于数组也是如此。无法获取任何数组元素。
    • 确保您有一个公共的无参数构造函数,并且您的 getter 和 setter 是公共的,并在此页面上查看 @JsonProperty:baeldung.com/jackson-annotations
    猜你喜欢
    • 2021-11-07
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多