我在當前項目中遇到了GSON多態對象的奇怪情況。情況是這樣的:我有兩個不同的使用情況下,兩個不同的抽象基類:GSON不包含區分字段基本列表對象列表
- 第一類包含在其本身列表中,並
- 第二類也包含列表中的,但該列表是一個更大的父對象的一部分
做作類的簡化版本(構造並且爲了簡潔省略了存取器;鑑別字段中定義但註釋了用於說明):
public abstract class ClassNumeric {
//private String numericType;
}
public class ClassOne extends ClassNumeric {
private String hex;
}
public class ClassTwo extends ClassNumeric {
private Integer whole;
private Integer fraction;
}
public abstract class ClassAlphabetic {
//private String alphabeticType;
}
public class ClassAlpha extends ClassAlphabetic {
private String name;
}
public class ClassBravo extends ClassAlphabetic {
private Integer age;
private Integer numberOfMarbles;
}
public class Container {
private String group;
private List<ClassAlphabetic> alphabetics;
}
個
適配器工廠和他們的登記與GSON:
public RuntimeTypeAdapterFactory<ClassNumeric> numericTypeFactory = RuntimeTypeAdapterFactory
.of(ClassNumeric.class, "numericType")
.registerSubtype(ClassOne.class)
.registerSubtype(ClassTwo.class);
public RuntimeTypeAdapterFactory<ClassAlphabetic> alphabeticTypeFactory = RuntimeTypeAdapterFactory
.of(ClassAlphabetic.class, "alphabeticType")
.registerSubtype(ClassAlpha.class)
.registerSubtype(ClassBravo.class);
public final Gson gson = new GsonBuilder()
.setPrettyPrinting()
.disableHtmlEscaping()
.registerTypeAdapterFactory(numericTypeFactory)
.registerTypeAdapterFactory(alphabeticTypeFactory)
.create();
基於我到目前爲止閱讀,我沒有(實際上不應該)在基地申報鑑別場因爲GSON在內部處理這些內容,因爲JSON是序列化和反序列化的。
下面是如何這些可以使用的一個示例:
ClassOne c1 = ClassOne.builder().hex("EF8A").build();
ClassTwo c2 = ClassTwo.builder().whole(1).fraction(3).build();
List<ClassNumeric> numerics = Arrays.asList(c1, c2); // List of child objects
log.debug("Numerics: " + gson.toJson(numerics));
ClassAlpha ca = ClassAlpha.builder().name("Fred").build();
ClassBravo cb = ClassBravo.builder().age(5).numberOfMarbles(42).build();
List<ClassAlphabetic> alphas = Arrays.asList(ca, cb);
Container container = Container.builder().group("Test Group 1").alphabetics(alpha).build(); // List of objects field on larger object
log.debug("Alphas (container): " + gson.toJson(container));
時遇到的問題是,ClassAlphabetic
對象正常工作(鑑別字段存在於JSON),而ClassNumeric
對象不要(歧視字段缺失)。示例輸出:
09:12:17.910 [main] DEBUG c.s.s.s.s.GSONPolymorphismTest - Numerics: [
{
"hex": "EF8A"
},
{
"whole": 1,
"fraction": 3
}
]
09:12:17.926 [main] DEBUG c.s.s.s.s.GSONPolymorphismTest - Alphas (container): {
"group": "Test Group 1",
"alphabetics": [
{
"alphabeticType": "ClassAlpha",
"name": "Fred"
},
{
"alphabeticType": "ClassBravo",
"age": 5,
"numberOfMarbles": 42
}
]
}
我在這裏錯過了什麼?這些基本上是用GSON進行定義和設置的,但其中一個用例在另一個用例中不起作用。