package com.brightgenerous.json.delegate; import java.io.Reader; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import com.brightgenerous.json.JsonException; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonSyntaxException; import com.google.gson.internal.$Gson$Types; class JsonDelegaterGson implements JsonDelegater { { check(); } private static void check() { try { Class.forName(Gson.class.getName()); Class.forName(GsonBuilder.class.getName()); Class.forName(JsonSyntaxException.class.getName()); } catch (ClassNotFoundException e) { throw new RuntimeException(e); } } @Override public Type getType(Object obj) { Type superclass = obj.getClass().getGenericSuperclass(); if (superclass instanceof Class) { throw new RuntimeException("Missing type parameter."); } ParameterizedType parameterized = (ParameterizedType) superclass; return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]); } @Override public <T> T parseJson(String json, Class<T> clazz, boolean serializeNulls) throws JsonException { return parseJson(json, clazz, null, serializeNulls); } @Override public <T> T parseJson(String json, Class<T> clazz, String dateFormat, boolean serializeNulls) throws JsonException { try { return create(dateFormat, serializeNulls).fromJson(json, clazz); } catch (JsonSyntaxException e) { throw new JsonException(e); } } @Override public <T> T parseJson(String json, Type type, boolean serializeNulls) throws JsonException { return parseJson(json, type, null, serializeNulls); } @Override public <T> T parseJson(String json, Type type, String dateFormat, boolean serializeNulls) throws JsonException { try { return create(dateFormat, serializeNulls).fromJson(json, type); } catch (JsonSyntaxException e) { throw new JsonException(e); } } @Override public <T> T parseJson(Reader json, Class<T> clazz, boolean serializeNulls) throws JsonException { return parseJson(json, clazz, null, serializeNulls); } @Override public <T> T parseJson(Reader json, Class<T> clazz, String dateFormat, boolean serializeNulls) throws JsonException { try { return create(dateFormat, serializeNulls).fromJson(json, clazz); } catch (JsonSyntaxException e) { throw new JsonException(e); } } @Override public <T> T parseJson(Reader json, Type type, boolean serializeNulls) throws JsonException { return parseJson(json, type, null, serializeNulls); } @Override public <T> T parseJson(Reader json, Type type, String dateFormat, boolean serializeNulls) throws JsonException { try { return create(dateFormat, serializeNulls).fromJson(json, type); } catch (JsonSyntaxException e) { throw new JsonException(e); } } @Override public String formatJson(Object obj, boolean serializeNulls) { return formatJson(obj, (String) null, serializeNulls); } @Override public String formatJson(Object obj, String dateFormat, boolean serializeNulls) { return create(dateFormat, serializeNulls).toJson(obj); } @Override public String formatJson(Object obj, Type type, boolean serializeNulls) { return formatJson(obj, type, null, serializeNulls); } @Override public String formatJson(Object obj, Type type, String dateFormat, boolean serializeNulls) { return create(dateFormat, serializeNulls).toJson(obj, type); } protected Gson create(String dateFormat, boolean serializeNulls) { GsonBuilder builder = new GsonBuilder(); if (dateFormat != null) { builder.setDateFormat(dateFormat); } if (serializeNulls) { builder.serializeNulls(); } return builder.create(); } }