Skip to content

Instantly share code, notes, and snippets.

@meierjan
Forked from krzysztof-miemiec/Album.java
Last active September 19, 2017 11:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save meierjan/36c885d76f1fda768837a27ea946eca3 to your computer and use it in GitHub Desktop.
Save meierjan/36c885d76f1fda768837a27ea946eca3 to your computer and use it in GitHub Desktop.
List parsing done with LoganSquare and Realm database.

First off props to @rs411.

How to use this? If you just c&p this as @peterbetos pointed out you get a

TypeConverter classes must have a non-private zero argument constructor.

How to solve this? As I am using this for diffent types like lets say RealmList<UserEntity>. I did the following:

/**
 * Created by meier on 26.08.16.
 */
public class UserEntityRealmListConverter extends RealmListConverter {
  public UserEntityRealmListConverter() {
    super(UserEntity.class);
  }
}

I basically did this for every Type and my RealmObject's look like this:

@JsonObject @Getter public class UserEntityList extends RealmObject {
  @JsonField(name = "random") int randomValue;
  /// [...]
  @JsonField(name = "userList", typeConverter = UserEntityRealmListConverter.class) RealmList<UserEntity>
      realmUserList;
}
/**
* @author Krzysztof Miemiec
*/
public class RealmListConverter<T extends RealmObject> implements TypeConverter<RealmList<T>> {
public interface SingleFieldSerialization<T> {
Object getValue(T object);
}
Class<T> clazz;
TypeConverter<T> typeConverter;
JsonMapper<T> mapper;
protected SingleFieldSerialization<T> singleFieldSerialization;
public RealmListConverter(Class<T> clazz) {
this.clazz = clazz;
}
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 (singleFieldSerialization != null) {
JsonMapper<Object> objectMapper = LoganSquare.mapperFor(Object.class);
for (T object : list) {
if (object != null) {
objectMapper.serialize(singleFieldSerialization.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();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment