Gson 中的嵌套类

问题描述 投票:0回答:1

我是 Gson 新手,我有一个来自嵌套 api 的 json 响应。我创建了嵌套类 -

public class GsOrgIds {
    
    public GsOrgIdsData data;
    public String msg;
    public int retCode;
    
}

public class GsOrgIdsData {
    public int pageNum;
    public int pageSize;
    public int pages;
    public int total;
    public List<GsOrgIdsResult> result;
}

public class GsOrgIdsResult {
    public long createTime;
    public boolean isDefault;
    public String description;
    public String organization;
    public int id;
}

当我尝试阅读它时 -

GsOrgIds value = new Gson().fromJson(response, GsOrgIds.class);

我明白了

com.google.gson.JsonIOException: Failed making field 'gsapi.GsOrgIds#data' accessible; either increase its visibility or write a custom TypeAdapter for its declaring type.
    

这是一个 json 示例 -

{
    "data": {
        "result": [
            {
                "id": 49,
                "organization": "Default1",
                "description": "",
                "isDefault": 1,
                "createTime": 1565074728000
            },
            {
                "id": 118,
                "organization": "1",
                "description": "2",
                "isDefault": 0,
                "createTime": 1565158013000
            }
        ],
        "total": 8,
        "pages": 1,
        "pageSize": 30,
        "pageNum": 1
    },
    "msg": "",
    "retCode": 0
}

我是否必须编写完整的反序列化,或者是否有更简单的方法让 Gson 查看嵌套类?谢谢!

java json gson
1个回答
0
投票

Gson 使用反射来访问类的字段。因此,如果您的项目使用

module-info.java
文件,您必须将其配置为允许 Gson 进行反射访问。
这可以通过指定
opens <package-name> to com.google.gson
:

来完成
module mymodule {
    requires com.google.gson;

    opens mypackage to com.google.gson;
}

或者,您也可以编写

open module mymodule { ... }
,在运行时打开所有模块的所有包。

请参阅 Gson 故障排除指南了解 Java 9 模块 了解更多信息。

既然您提到您已经创建了“嵌套类”,请确保这些类是

static
。否则,它们没有默认的无参数构造函数,并且 Gson 会回退到使用 JDK 内部来创建实例,这可能很容易出错,另请参阅
GsonBuilder.disableJdkUnsafe()

© www.soinside.com 2019 - 2024. All rights reserved.