/* * Copyright (C) 2014 Civilian Framework. * * Licensed under the Civilian License (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.civilian-framework.org/license.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.civilian.content; import java.io.Reader; import java.io.Writer; import java.lang.reflect.Type; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; import org.civilian.text.keys.KeyList; import org.civilian.text.keys.serialize.KeyListSerializer; import org.civilian.util.Check; import org.civilian.util.ClassUtil; /** * A ContentSerializer for JSON data based on GSON. */ public class GsonJsonSerializer extends ContentSerializer { /** * Creates a new JsonSerializer. */ public GsonJsonSerializer() { this(new GsonBuilder()); } /** * Creates a new JsonSerializer. The gson object of the serializer * is obtained from the builder */ public GsonJsonSerializer(GsonBuilder builder) { Check.notNull(builder, "builder"); builder.registerTypeHierarchyAdapter(KeyList.class, new KeyListSerializer()); gson_ = builder.create(); } /** * Creates a new JsonSerializer based on the gson object. */ public GsonJsonSerializer(Gson gson) { Check.notNull(gson, "gson"); gson_ = gson; } /** * Uses the JsonService of the application to parse the content. */ @SuppressWarnings("unchecked") @Override public <T> T read(Class<T> type, Type genericType, Reader reader) throws Exception { Check.notNull(type, "type"); Check.notNull(reader, "reader"); if (type == JsonElement.class) { JsonParser parser = new JsonParser(); return (T)parser.parse(reader); } else if (genericType != null) return gson_.fromJson(reader, genericType); else return gson_.fromJson(reader, type); } /** * Writes the content of the response. */ @Override public void write(Object object, Writer writer) throws Exception { if (object instanceof JsonElement) gson_.toJson((JsonElement)object, writer); else gson_.toJson(object, writer); } /** * Returns the gson object if implClass equals Gson.class. */ @Override public <T> T unwrap(Class<T> implClass) { return ClassUtil.unwrap(gson_, implClass); } /** * Returns the exception message if the exception is a JsonSyntaxException * or a JsonParseException, else returns null. */ @Override public String describeReadError(Exception e) { return (e instanceof JsonSyntaxException) || (e instanceof JsonParseException) ? e.getMessage() : null; } private Gson gson_; }