我必须在Json下面反序列化
{
"Student": [
{
"Number": "12345678",
"Name": "abc"
"Country": "IN",
"AreaOfInterest": [
{
“FootBall”: “Yes”,
“Cricket”: “No”
}
]
}
],
"hasMore": false,
"links": [
{
"rel": "self",
"kind": "collection"
}
]
}
进入POJO以下
class {
private String number;
private String name;
private String footBall;
}
我写了Gson自定义解串器,以提升 AreaOfInterest ,如下所示
public List<? extends Student> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
var jsonObject = json.getAsJsonObject();
Stream<JsonElement> student = StreamSupport.stream(jsonObject.getAsJsonArray("Student").spliterator(), true);
Stream<JsonElement> areaOfInterest = StreamSupport.stream(jsonObject.getAsJsonArray("Student").get(0).getAsJsonObject().get("AreaOfInterest").getAsJsonArray().spliterator(), true);
Stream.concat(student,areaOfInterest)
.map(it -> context.deserialize(it, Student.class))
.map(Student.class::cast)
.collect(List.collector())
}
但是反序列化器返回的是Student的两个对象,而不是一个,一个是除 footBall 以外的所有字段均为空,另一个是实际的 student ,除了 footBall 以外null,任何帮助如何获取所有字段的单个对象将大有帮助,在此先感谢。
答案 0 :(得分:0)
这不是您的确切答案,但是使用gson获取地图并从该地图构建pojo可能会更简单。另外,如果您不喜欢该地图,则创建一个类似于JSON的pojo,然后将该pojo映射到所需的pojo。
背景/理由:GSON现在是您选择的映射器,但可能会更改为其他名称,例如。如果发生这种情况,Jackson和您所有自定义的特定于框架的映射器将需要进行转换/更改。使用gson创建一个看起来像源的对象,并将其映射到控制器中的自定义POJO,这将使您的代码意图清晰明了,并且代码对框架的更改更具弹性。