自定义反序列化器可解析复杂的Json

时间:2019-01-21 12:37:23

标签: java json gson

我必须在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,任何帮助如何获取所有字段的单个对象将大有帮助,在此先感谢。

1 个答案:

答案 0 :(得分:0)

这不是您的确切答案,但是使用gson获取地图并从该地图构建pojo可能会更简单。另外,如果您不喜欢该地图,则创建一个类似于JSON的pojo,然后将该pojo映射到所需的pojo。

背景/理由:GSON现在是您选择的映射器,但可能会更改为其他名称,例如。如果发生这种情况,Jackson和您所有自定义的特定于框架的映射器将需要进行转换/更改。使用gson创建一个看起来像源的对象,并将其映射到控制器中的自定义POJO,这将使您的代码意图清晰明了,并且代码对框架的更改更具弹性。