首页 > 解决方案 > 从 json 映射到对象时得到错误的结果

问题描述

我正在使用 Spring 和其他框架编写一个 java 应用程序。我正在尝试使用 GSON 将数据从字符串获取到自定义对象。在我的代码中,我使用GSON将字符串映射到自定义对象。我就是这样做的:

gson.fromJson(response.getBody(), Hello.class)

在我的Hello.java,我有:

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Hello {

    @JsonProperty("test1")
    List<Test1> test1;

    @JsonProperty("test2")
    List<Test2> test2;

}

@JsonIgnoreProperties(ignoreUnknown = true)
class Test1 {

    @JsonProperty("a")
    private String a;

    @JsonProperty("b")
    private String b;

}

@JsonIgnoreProperties(ignoreUnknown = true)
class Test2 {

    @JsonProperty("x")
    private Test3 test3;

    @JsonProperty("y")
    private String y;

}

@JsonIgnoreProperties(ignoreUnknown = true)
class Test3 {

    @JsonProperty("l")
    private String l;

    @JsonProperty("m")
    private String m;

}

我的 JSON 看起来有点像这样:

{
    "test1": [
        {
            "a": "a",
            "b": "b"
        }
    ],
    "test2": [
        {
            "x": {
                "l": "l",
                "m": "m"
            },
            "y": "y"
        }
    ]
}

但是只有 test1 被 Gson 正确加载了所有值,而 test2 完全为空。我在这里做错了什么?

标签: javagson

解决方案


代替

gson.fromJson(response.getBody(), Hello.class);

利用

String json = new String(response.body().bytes());
gson.fromJson(json , Hello.class)

而且,检查你的json字符串可能有无效字符可能来自不好的 Web 服务设计,例如:2 双引号开始和结束 json 字符串。

\"{\"message\":\"hello\"}\"<= 这是错误的

正确的是

{\"message\":\"hello\"}或者{"message":"hello"}

并且还使用@SerializedName代替@JsonProperty

最后检查区分大小写的json键,我的意思M是不等于m


推荐阅读