用 genson 解析嵌套 JSON
Parse nested JSON with genson
我正在尝试解析一些 JSON 我从网络 API 到 Java 对象并遇到一些问题。
这里是 JSON:
{
"d":{
"results":[
{
"__metadata" { some metadata I'm not interested in },
"attribute1":"attribute id 1",
"attribute2:"attribute value 1"
},
{
"__metadata" { some metadata I'm not interested in },
"attribute1":"attribute id 2",
"attribute2:"attribute value 2"
}
]
}
}
现在我想将以下数据映射到 Java 类,以便结果是一个 Catalog 对象,结果数组中的值是 CatalogEntry 对象:
public class Catalog {
private final List<CatalogEntry> values;
public Catalog() {
values = null;
}
public Catalog(@JsonProperty("results") List<CatalogEntry> values) {
super();
this.values = values;
}
}
public class CatalogEntry {
private String attribute1;
private String attribute2;
public CatalogEntry() {}
public CatalogEntry(@JsonProperty("attribute1") String attribute1,
@JsonProperty("attribute2") String attribute2) {
this.attribute1 = attribute1;
this.attribute2 = attribute2;
}
}
使用以下行,我尝试将 JSON 字符串反序列化为 Catalog 对象:
Catalog catalog = genson.deserialize(json, Catalog.class);
之后,我尝试获取 Catalog 对象中的值,但得到一个 NullPointerException,因为它似乎是空的。我认为反序列化在 JSON 中的 "d" 对象有问题,但我该如何解决这个问题?任何帮助将不胜感激。
问题是你有 2 个构造函数,一个没有参数,另一个有参数。 Genson 在这种情况下选择了空的构造函数。
由于属性不可见且没有 setter,因此它不会填充值。
因此,如果您希望 Genson 使用特定的构造函数,则必须使用 @JsonCreator 对其进行注释。顺便说一句,如果您使用此选项配置 Genson,则可以删除参数上的 JsonProperty("..."):
Genson genson = new GensonBuilder()
.useConstructorWithArguments(true)
.create();
另一种选择是通过这样做告诉 Genson 使用私有属性:
Genson genson = new GensonBuilder()
.useFields(true, VisibilityFilter.PRIVATE)
.create();
在那种情况下,您不需要构造函数上的注释,因为 Genson 将使用无参数注释。我推荐你第一个选项。
我正在尝试解析一些 JSON 我从网络 API 到 Java 对象并遇到一些问题。
这里是 JSON:
{
"d":{
"results":[
{
"__metadata" { some metadata I'm not interested in },
"attribute1":"attribute id 1",
"attribute2:"attribute value 1"
},
{
"__metadata" { some metadata I'm not interested in },
"attribute1":"attribute id 2",
"attribute2:"attribute value 2"
}
]
}
}
现在我想将以下数据映射到 Java 类,以便结果是一个 Catalog 对象,结果数组中的值是 CatalogEntry 对象:
public class Catalog {
private final List<CatalogEntry> values;
public Catalog() {
values = null;
}
public Catalog(@JsonProperty("results") List<CatalogEntry> values) {
super();
this.values = values;
}
}
public class CatalogEntry {
private String attribute1;
private String attribute2;
public CatalogEntry() {}
public CatalogEntry(@JsonProperty("attribute1") String attribute1,
@JsonProperty("attribute2") String attribute2) {
this.attribute1 = attribute1;
this.attribute2 = attribute2;
}
}
使用以下行,我尝试将 JSON 字符串反序列化为 Catalog 对象:
Catalog catalog = genson.deserialize(json, Catalog.class);
之后,我尝试获取 Catalog 对象中的值,但得到一个 NullPointerException,因为它似乎是空的。我认为反序列化在 JSON 中的 "d" 对象有问题,但我该如何解决这个问题?任何帮助将不胜感激。
问题是你有 2 个构造函数,一个没有参数,另一个有参数。 Genson 在这种情况下选择了空的构造函数。 由于属性不可见且没有 setter,因此它不会填充值。
因此,如果您希望 Genson 使用特定的构造函数,则必须使用 @JsonCreator 对其进行注释。顺便说一句,如果您使用此选项配置 Genson,则可以删除参数上的 JsonProperty("..."):
Genson genson = new GensonBuilder()
.useConstructorWithArguments(true)
.create();
另一种选择是通过这样做告诉 Genson 使用私有属性:
Genson genson = new GensonBuilder()
.useFields(true, VisibilityFilter.PRIVATE)
.create();
在那种情况下,您不需要构造函数上的注释,因为 Genson 将使用无参数注释。我推荐你第一个选项。