Я использую библиотеку Gson . Что такое чистый / идиоматический c способ попросить Gson сериализовать только поля базового класса, когда объект, передаваемый Gson, имеет тип базового класса? Обратите внимание, что это отличается от аналогичных вопросов (например, этот ), которые задают, как всегда исключать указанные c поля. В моем случае использования я хочу исключить наследуемые поля класса только тогда, когда библиотеке Gson передается объект производного класса через ссылку на тип базового класса. В противном случае, т. Е. Если библиотеке Gson передается объект производного класса через типизированную ссылку на производный класс, я хочу, чтобы поля появлялись в сериализации.
SSCCE следует:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class A {
public int a;
public A(final int a) {
this.a = a;
}
}
class B extends A {
public int b;
public B(final int a, final int b) {
super(a);
this.b = b;
}
}
public class Main {
public static void main(String args[]) {
final A a = new B(42, 142);
final Gson gson = new GsonBuilder().serializeNulls().create();
System.out.printf("%s\n", gson.toJson(a));
}
}
Приведенные выше отпечатки:
{"b": 142, "a": 42}
Я ищу чистый способ сделать он печатает:
{"a": 42}
Однако, если используется следующий код:
final B b = new B(42, 142);
... тогда я хотите, чтобы gson.toJson(b)
действительно вернул:
{"b": 142, "a": 42}
Есть ли чистый способ добиться этого?
ОБНОВЛЕНИЕ
На момент написания принятый ответ предлагает использовать toJson(o, A.class)
, который в этом случае работает. Однако, похоже, что этот метод не подходит для генериков. Например:
class A {
public int a;
public A(final int a) {
this.a = a;
}
}
class B extends A {
public int b;
public B(final int a, final int b) {
super(a);
this.b = b;
}
}
class Holder<T> {
public final T t;
public Holder(final T t) {
this.t = t;
}
}
final A a = new B(42, 142);
final Holder<A> holder = new Holder<A>(a);
final Gson gson = new GsonBuilder().serializeNulls().create();
final Type TYPE= new TypeToken<Holder<A>>() {}.getType();
System.out.printf("%s\n", gson.toJson(holder, TYPE));
К сожалению, вышеприведенные отпечатки:
{"t":{"b":142,"a":42}}