|
/** |
|
* The universal converter for RealmList. |
|
* You can use this with RealmObjects: |
|
* 1. Annotated with @JsonObject |
|
* 2. With custom converters, such as RealmString below. |
|
* @author Krzysztof Miemiec |
|
*/ |
|
public class RealmListConverter<T extends RealmObject> implements TypeConverter<RealmList<T>> { |
|
|
|
/** |
|
* This is useful if you want to use this converter for sending just a simple part of object back to server. |
|
* For example: |
|
* Server gives you this: |
|
* [{"id": 1, "description": "Doxie!", "image": "http://imgur.com/r/Dachshund/OGKuGTR"}, |
|
* {"id": 33, "description": "Second doxie!", "image": "http://imgur.com/r/Dachshund/nU3PlyO"}] |
|
* You send back: |
|
* [1, 33] |
|
*/ |
|
public interface SingleFieldSerialization<T> { |
|
Object getValue(T object); |
|
} |
|
|
|
private Class<T> clazz; |
|
private TypeConverter<T> typeConverter; |
|
private JsonMapper<T> mapper; |
|
private SingleFieldSerialization<T> serializer; |
|
|
|
public RealmListConverter(Class<T> clazz) { |
|
this.clazz = clazz; |
|
} |
|
|
|
public RealmListConverter(Class<T> clazz, SingleFieldSerialization<T> serializer){ |
|
this.clazz = clazz; |
|
this.serializer = serializer; |
|
} |
|
|
|
private void init() { |
|
if (typeConverter == null && mapper == null) { |
|
try { |
|
typeConverter = LoganSquare.typeConverterFor(clazz); |
|
} catch (NoSuchTypeConverterException e) { |
|
mapper = LoganSquare.mapperFor(clazz); |
|
} |
|
} |
|
} |
|
|
|
@Override |
|
public RealmList<T> parse(JsonParser jsonParser) throws IOException { |
|
init(); |
|
RealmList<T> list = new RealmList<>(); |
|
if (jsonParser.getCurrentToken() == JsonToken.START_ARRAY) { |
|
while (jsonParser.nextToken() != JsonToken.END_ARRAY) { |
|
T object = typeConverter != null ? typeConverter.parse(jsonParser) : mapper.parse(jsonParser); |
|
if (object != null) { |
|
list.add(object); |
|
} |
|
} |
|
} |
|
return list; |
|
} |
|
|
|
@Override |
|
public void serialize(RealmList<T> list, String fieldName, boolean writeFieldNameForObject, JsonGenerator jsonGenerator) throws IOException { |
|
if (writeFieldNameForObject) { |
|
if (list == null) { |
|
return; |
|
} |
|
jsonGenerator.writeFieldName(fieldName); |
|
} |
|
if (list == null) { |
|
jsonGenerator.writeNull(); |
|
return; |
|
} |
|
jsonGenerator.writeStartArray(); |
|
if (serializer != null) { |
|
JsonMapper<Object> objectMapper = LoganSquare.mapperFor(Object.class); |
|
for (T object : list) { |
|
if (object != null) { |
|
objectMapper.serialize(serializer.getValue(object), jsonGenerator, true); |
|
} else { |
|
jsonGenerator.writeNull(); |
|
} |
|
} |
|
} else { |
|
init(); |
|
for (T object : list) { |
|
if (object != null) { |
|
if (typeConverter != null) { |
|
typeConverter.serialize(object, fieldName, false, jsonGenerator); |
|
} else { |
|
mapper.serialize(object, jsonGenerator, true); |
|
} |
|
} else { |
|
jsonGenerator.writeNull(); |
|
} |
|
} |
|
} |
|
jsonGenerator.writeEndArray(); |
|
} |
|
} |
@Vinvent-Loi: look here https://gist.github.com/meierjan/36c885d76f1fda768837a27ea946eca3