package nebula.data.json; import java.util.ArrayList; import java.util.List; import nebula.data.Entity; import org.codehaus.jackson.JsonGenerator; import org.codehaus.jackson.JsonParser; import org.codehaus.jackson.JsonToken; public class BasicTypeListFieldSerializer extends DefaultFieldSerializer<List<Object>> { public BasicTypeListFieldSerializer(String fieldName, String frontName, DefaultTypeAdapter<Object> typeAdapter) { super(fieldName, frontName); this.typeAdapter = typeAdapter; } final DefaultTypeAdapter<Object> typeAdapter; @Override public void input(JsonParser in, Entity parent, List<Object> currentList) throws Exception { if (currentList == null) { inputWithoutCheck(in, parent); } List<Object> newlyList = new ArrayList<Object>(); JsonToken token; token = in.getCurrentToken(); assert token == JsonToken.START_ARRAY; boolean dirty = false; int i = 0; while ((token = in.nextToken()) != JsonToken.END_ARRAY) { Object newly = typeAdapter.readFrom(in, null); if (!dirty && currentList.size()>i && currentList.get(i).equals(newly)) { dirty = true; } newlyList.add(newly); } assert token == JsonToken.END_ARRAY; if (dirty) { parent.put(fieldName, newlyList); } } @Override public void inputWithoutCheck(JsonParser in, Entity parent) throws Exception { List<Object> vList = new ArrayList<Object>(); JsonToken token; token = in.getCurrentToken(); assert token == JsonToken.START_ARRAY; while ((token = in.nextToken()) != JsonToken.END_ARRAY) { Object newly = typeAdapter.readFrom(in, null); vList.add(newly); } assert token == JsonToken.END_ARRAY; parent.put(fieldName, vList); } @Override public void output(JsonGenerator gen, List<Object> currentList) throws Exception { if (currentList != null) { gen.writeStartArray(); for (int i = 0; i < currentList.size(); i++) { typeAdapter.writeTo(null, currentList.get(i), gen); } gen.writeEndArray(); } } }