Fix adapters order

This commit is contained in:
Andrea Cavalli 2021-06-08 19:55:10 +02:00
parent 74593538dc
commit 135d71bb44
1 changed files with 8 additions and 3 deletions

View File

@ -30,6 +30,7 @@ public abstract class MoshiPolymorphic<OBJ> {
private Moshi abstractMoshi;
private final Map<Class<?>, JsonAdapter<OBJ>> abstractClassesSerializers = new ConcurrentHashMap<>();
private final Map<Class<?>, JsonAdapter<OBJ>> concreteClassesSerializers = new ConcurrentHashMap<>();
private final Map<Class<?>, JsonAdapter<?>> extraClassesSerializers = new ConcurrentHashMap<>();
private final Map<String, JsonAdapter<OBJ>> customAdapters = new ConcurrentHashMap<>();
public MoshiPolymorphic() {
@ -49,14 +50,17 @@ public abstract class MoshiPolymorphic<OBJ> {
var concreteClasses = getConcreteClasses();
var extraAdapters = getExtraAdapters();
extraAdapters.forEach(abstractMoshiBuilder::addLast);
extraAdapters.forEach((extraClass, jsonAdapter) -> {
extraClassesSerializers.put(extraClass, jsonAdapter);
abstractMoshiBuilder.add(extraClass, jsonAdapter);
});
for (Class<?> declaredClass : abstractClasses) {
var name = fixType(declaredClass.getSimpleName());
JsonAdapter<OBJ> adapter = new PolymorphicAdapter<>(name);
abstractClassesSerializers.put(declaredClass, adapter);
customAdapters.put(name, adapter);
abstractMoshiBuilder.addLast(declaredClass, adapter);
abstractMoshiBuilder.add(declaredClass, adapter);
}
for (Class<?> declaredClass : concreteClasses) {
@ -64,7 +68,7 @@ public abstract class MoshiPolymorphic<OBJ> {
JsonAdapter<OBJ> adapter = new NormalValueAdapter<>(name, declaredClass);
concreteClassesSerializers.put(declaredClass, adapter);
customAdapters.put(name, adapter);
abstractMoshiBuilder.addLast(declaredClass, adapter);
abstractMoshiBuilder.add(declaredClass, adapter);
}
abstractMoshiBuilder.addLast(new RecordsJsonAdapterFactory());
@ -85,6 +89,7 @@ public abstract class MoshiPolymorphic<OBJ> {
public Moshi.Builder registerAdapters(Moshi.Builder moshiBuilder) {
initialize();
extraClassesSerializers.forEach(moshiBuilder::add);
abstractClassesSerializers.forEach(moshiBuilder::add);
concreteClassesSerializers.forEach(moshiBuilder::add);
return moshiBuilder;