Ошибка Gson "объявляет несколько именованных полей JSON" для переопределенных унаследованных полей - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть 2 класса:

Родитель

class Parent {
    @SerializedName("variable1")
    int variable1;

    @SerializedName("child")
    Child child;

    //Getters and Setters
}

Child

class Child {
    @SerializedName("childVar")
    int childVar1;

    //Getters and Setters
}

Они расширены как:

ExtendedChild

class ExtendedChild extends Child {
    @SerializedName("childVar2")
    int childVar2;

    //Getters and Setters
}

ExtendedParent

class ExtendedParent extends Parent {
    @SerializedName("variable2")
    int variable2; 

    @SerializedName("child")
    ExtendedChild extendedChild;

    //Getters and Setters
}

Я хочу использовать эти классы для маршалинга от Json. Я планирую использовать библиотеку GSON. Я хочу отменить маршалинг в классы ExtendedParent или Parent на основе полезной нагрузки. Я знаю в своем коде, какой это тип Parent. Просто для того, чтобы правильно представлять и избегать избыточного объявления переменных, я хотел использовать Inheritance. Ниже приведены два примера со мной -

Я перенесу нижеследующую полезную нагрузку в ExtendedParent.class

{
    'variable1':12,
    'variable2':23,
    'child':{
        'childVar1': 43,
        'childVar2': 23
    }
}

Я перенесу нижнюю полезную нагрузку в Parent.class

{
    'variable1':12,
    'child':{
        'childVar1': 43
    }
}

Однако, когда я пытаюсь разархивировать, как показано ниже,

ExtendedParent extendedParent = new Gson()
        .fromJson('<Passing the first Json string above>', ExtendedParent.class);

Я сталкиваюсь ниже исключения.

java.lang.IllegalArgumentException: класс ExtendedParent объявляет несколько полей JSON с именем child

Не в состоянии понять, в чем проблема. Любая помощь или указатели будут высоко оценены. Я попробовал несколько способов избежать скрытия переменных на объектах Child, но я не могу понять, как решить эту проблему.

1 Ответ

0 голосов
/ 05 ноября 2018

GSON не справляется с полями, объявленными несколько раз с одинаковыми именами, будь то имя поля Java или имя сериализации. Используйте дженерики, чтобы избежать такой ситуации. Объявите ваш Parent как:

public class Parent<T extends Child> {
    private T child;
    // any other stuff
}

и ExtendedParent как:

public class ExtendedParent extends Parent<ExtendedChild> {
    // note no more declaring the field "child"
    // any other stuff
}

Если вам нужно использовать имя extendedChild, вы можете просто создать методы получения и установки для этого имени, которые обрабатывают с помощью child.

Смежный вопрос здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...