package org.javers.core.json; import com.google.gson.*; import org.javers.core.json.typeadapter.commit.CdoSnapshotAssembler; import org.javers.core.metamodel.object.CdoSnapshot; import java.lang.reflect.Type; import static org.javers.common.validation.Validate.argumentsAreNotNull; /** * Javers is meant to support various persistence stores for * any kind of client's data, hence we use JSON format to serialize/deserialize client's domain objects. * <br><br> * * Javers uses <a href='http://sites.google.com/site/gson/'>Gson</a> * library which provides neat and pretty JSON representation for well known Java types. * <br><br> * * But sometimes Gson's default JSON representation isn't appropriate for your domain model. * This is often the case when dealing with Values like Date or Money. * <br><br> * * If so, you can easily customize Javers serialization/deserialization behaviour * by providing plugins for each of your custom type. * Javers accepts several kind of plugins: * <ul> * <li> {@link BasicStringTypeAdapter} - * extend it if you need to represent Value as single String and don't want to deal with JSON API. * For concrete class example see {@link org.javers.java8support.LocalDateTimeTypeAdapter}. * <li> {@link JsonTypeAdapter} - use it if you need full control over JSON conversion * <li> native Gson {@link TypeAdapter} * <li> native Gson {@link JsonSerializer} * <li> native Gson {@link JsonDeserializer} * </ul> * * Javers provides JsonTypeAdapters for some well known Values like java.time.LocalDateTime, * org.joda.time.LocalDateTime. * * @author bartosz walacik */ public class JsonConverter { private final Gson gson; private final CdoSnapshotAssembler cdoSnapshotAssembler; JsonConverter(Gson gson) { argumentsAreNotNull(gson); this.gson = gson; this.cdoSnapshotAssembler = new CdoSnapshotAssembler(this); } public String toJson(Object value) { return gson.toJson(value); } public JsonElement toJsonElement(Object value) { return gson.toJsonTree(value); } public <T> T fromJson(String json, Class<T> expectedType){ return gson.fromJson(json, expectedType); } public Object fromJson(String json, Type expectedType) { return gson.fromJson(json, expectedType); } public JsonElement fromJsonToJsonElement(String json){ return gson.fromJson(json, JsonElement.class); } public <T> T fromJson(JsonElement json, Class<T> expectedType) { return gson.fromJson(json, expectedType); } public CdoSnapshot fromSerializedSnapshot(CdoSnapshotSerialized cdoSnapshotSerialized) { return fromJson(cdoSnapshotAssembler.assemble(cdoSnapshotSerialized), CdoSnapshot.class); } }