我是 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 查看嵌套类?谢谢!
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()
。