Как сериализовать с Gson объект, который определяет переменную с тем же именем, что и переменная, унаследованная от parent - PullRequest
0 голосов
/ 22 декабря 2018

Я хочу написать новый класс, который расширяет другой, и в новом классе я хочу определить переменную с тем же именем, что и у родительского.Я могу сделать это нормально в Java, так как оба являются частными, но когда я пытаюсь сериализовать объект с помощью gson, я получаю сообщение об ошибке, так как есть два свойства с одинаковым именем (даже если наследуемое от родительского класса равно нулю и, следовательно, не должнобыть включены в JSON).

Например, рассмотрим эти классы:

public class Car {
    private String color;
    private Seat seat;
}

public class Seat {
    private boolean isAdjustable;
}

и эти классы:

public class FancyCar extends Car {
    private FancySeat seat;
    private boolean hasSpoiler;
}

public class Fancyseat extends Seat {
    private boolean hasSeatWarmers;
}

с этими классами я мог бы создать новый FancyCarс сиденьем, которое является регулируемым и имеетSeatWarmers.Но если бы я выполнил сериализацию с помощью gson, это вызвало бы исключение, поскольку он попытался бы проанализировать обе переменные с именем seat, даже если та, что унаследована от Car, равна нулю.

Есть ли лучший способ разработки этих классов?Или способ заставить gson полностью игнорировать нулевые поля?

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете использовать @SerializedName (value = "fancySeat"). Кроме того, из Gson версии 2.4 имеется возможность чередовать или иметь несколько имен для serializedName при десериализации.Нет необходимости в CustomTypeadapter. Имена полей Gson
Пример для нескольких имен десериализации

package com.test.practice;

import com.google.gson.Gson;
import com.google.gson.annotations.SerializedName;

public class JsonSerializationExample {

public static void main(String[] args) {
    // TODO Auto-generated method stub


    Seat seatCar = new Seat();
    seatCar.setAdjustable(true);

    Fancyseat fancySeat = new Fancyseat();
    fancySeat.setHasSeatWarmers(true);
    fancySeat.setAdjustable(false);

    Car car = new Car();
    car.setColor("black");
    car.setSeat(seatCar);

    FancyCar fancyCar = new FancyCar();
    fancyCar.setColor("white");
    fancyCar.setSeat(fancySeat);

    Gson gson = new Gson();
    String jsonString = gson.toJson(fancyCar);
    System.out.println("json :: "+jsonString);  
  }

}

class Car {
private String color;
private Seat seat;
public String getColor() {
    return color;
}
public void setColor(String color) {
    this.color = color;
}
public Seat getSeat() {
    return seat;
}
public void setSeat(Seat seat) {
    this.seat = seat;
}

}

class Seat {
private boolean isAdjustable;

public boolean isAdjustable() {
    return isAdjustable;
}

public void setAdjustable(boolean isAdjustable) {
    this.isAdjustable = isAdjustable;
}

} 

 class FancyCar extends Car {

 @SerializedName(value = "fancySeat")
    private Fancyseat seat;
    private boolean hasSpoiler;
    public Fancyseat getSeat() {
        return seat;
    }
    public void setSeat(Fancyseat seat) {
        this.seat = seat;
    }
    public boolean isHasSpoiler() {
        return hasSpoiler;
    }
    public void setHasSpoiler(boolean hasSpoiler) {
        this.hasSpoiler = hasSpoiler;
    }

  }

 class Fancyseat extends Seat {
    private boolean hasSeatWarmers;

    public boolean isHasSeatWarmers() {
        return hasSeatWarmers;
    }

    public void setHasSeatWarmers(boolean hasSeatWarmers) {
        this.hasSeatWarmers = hasSeatWarmers;
    }


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