Пользовательский десериализатор для разбора сложного Json

Мне нужно десериализовать ниже 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, чтобы поднять Круг интересов, как показано ниже.

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 вместо одного, один - все поля пустые, кроме футбол, другой - фактический ученик, за исключением футбол как нулевой, любая помощь, как получить один объект со всеми полями, будет очень полезна, заранее спасибо.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
46
1

Ответы 1

Это не будет вашим точным ответом, но может быть проще использовать gson для получения карты и создания вашего pojo из этой карты. В качестве альтернативы, если вам не нравится карта, создайте pojo, который выглядит как ваш JSON, и сопоставьте этот pojo с нужным вам pojo.

Предыстория/обоснование: GSON — это картограф, который вы выбрали прямо сейчас, но его можно изменить на что-то другое, например. Джексон, и все ваши пользовательские картографы, специфичные для фреймворка, должны быть преобразованы/изменены, если это произойдет. Использование gson для создания объекта, который выглядит как источник, и сопоставление его с вашим пользовательским POJO в вашем контроллере сделает ваше намерение кода ясным, а ваш код более устойчивым к изменениям фреймворка.

Спасибо, Ричард, я согласен, но я планирую использовать пользовательский десериализатор Ученик в качестве универсального, например, ПлощадьИнтересов, некоторые другие сложные JsonElement могут быть добавлены к исходному, поэтому я просто пытаюсь сделать его как можно более универсальным.

Ranjukumar Gowda 21.01.2019 14:50

Это прекрасно, приятель, просто имейте в виду соотношение затрат и выгод. Если оно того стоит, удачного взлома ?

Richard 21.01.2019 14:56

Другие вопросы по теме