package org.sql2o.extensions.postgres.converters; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonParser; import org.postgresql.util.PGobject; import org.sql2o.converters.Converter; import org.sql2o.converters.ConverterException; import org.sql2o.converters.ConvertersProvider; import org.sql2o.converters.StringConverter; import java.util.Map; /** * User: dimzon * Date: 4/25/14 * Time: 12:08 AM */ public class JSONConverter implements Converter<JsonElement>, ConvertersProvider { public void fill(Map<Class<?>, Converter<?>> mapToFill) { mapToFill.put(JsonElement.class, this); } public JsonElement convert(Object val) throws ConverterException { if (val == null) return null; if (val instanceof JsonElement) return (JsonElement) val; String jsonString; if (val instanceof String) { jsonString = (String) val; } else if (val instanceof PGobject) { // at one side this is just a demo // the better way is to unwrap PGObject to String // with type==json in Quirks.getRSVal jsonString = ((PGobject) val).getValue(); } else { jsonString = stringConverterHolder.converter.convert(val); } return parserHolder.parser.parse(jsonString); } public Object toDatabaseParam(JsonElement val) { if (val == null) return null; final StringBuilder stringBuilder = new StringBuilder(); writerHolder.gson.toJson(val, stringBuilder); return stringBuilder.toString(); } static class parserHolder { static final JsonParser parser = new JsonParser(); } static class writerHolder { static final Gson gson = new Gson(); } static class stringConverterHolder { static final StringConverter converter = new StringConverter(); } }