io.vlingo.common.serialization.JsonSerialization Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of vlingo-common Show documentation
Show all versions of vlingo-common Show documentation
These are just a few common tools shared across various vlingo projects.
// Copyright © 2012-2020 VLINGO LABS. All rights reserved.
//
// This Source Code Form is subject to the terms of the
// Mozilla Public License, v. 2.0. If a copy of the MPL
// was not distributed with this file, You can obtain
// one at https://mozilla.org/MPL/2.0/.
package io.vlingo.common.serialization;
import java.lang.reflect.Type;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;
public class JsonSerialization {
private final static Gson gson;
static {
gson = new GsonBuilder()
.registerTypeAdapter(Class.class, new ClassSerializer())
.registerTypeAdapter(Class.class, new ClassDeserializer())
.registerTypeAdapter(Date.class, new DateSerializer())
.registerTypeAdapter(Date.class, new DateDeserializer())
.registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeSerializer())
.registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeDeserializer())
.create();
}
public static T deserialized(String serialization, final Class type) {
T instance = gson.fromJson(serialization, type);
return instance;
}
public static T deserialized(String serialization, final Type type) {
T instance = gson.fromJson(serialization, type);
return instance;
}
public static List deserializedList(String serialization, final Type listOfType) {
final List list = gson.fromJson(serialization, listOfType);
return list;
}
public static String serialized(final Object instance) {
final String serialization = gson.toJson(instance);
return serialization;
}
public static String serialized(final Collection instance) {
final Type collectionOfT = new TypeToken>(){}.getType();
final String serialization = gson.toJson(instance, collectionOfT);
return serialization;
}
public static String serialized(final List instance) {
final Type listOfT = new TypeToken>(){}.getType();
final String serialization = gson.toJson(instance, listOfT);
return serialization;
}
@SuppressWarnings("rawtypes")
private static class ClassSerializer implements JsonSerializer {
@Override
public JsonElement serialize(Class source, Type typeOfSrc, JsonSerializationContext context) {
return new JsonPrimitive(source.getName());
}
}
@SuppressWarnings("rawtypes")
private static class ClassDeserializer implements JsonDeserializer {
@Override
public Class deserialize(JsonElement json, Type typeOfTarget, JsonDeserializationContext context) throws JsonParseException {
final String classname = json.getAsJsonPrimitive().getAsString();
try {
return Class.forName(classname);
} catch (ClassNotFoundException e) {
throw new JsonParseException(e);
}
}
}
private static class DateSerializer implements JsonSerializer {
@Override
public JsonElement serialize(Date source, Type typeOfSource, JsonSerializationContext context) {
return new JsonPrimitive(Long.toString(source.getTime()));
}
}
private static class DateDeserializer implements JsonDeserializer {
@Override
public Date deserialize(JsonElement json, Type typeOfTarget, JsonDeserializationContext context) throws JsonParseException {
long time = Long.parseLong(json.getAsJsonPrimitive().getAsString());
return new Date(time);
}
}
private static class OffsetDateTimeSerializer implements JsonSerializer {
@Override
public JsonElement serialize(OffsetDateTime source, Type typeOfSource, JsonSerializationContext context) {
return new JsonPrimitive(Long.toString(source.toInstant().toEpochMilli()) + ";" + source.getOffset().toString());
}
}
private static class OffsetDateTimeDeserializer implements JsonDeserializer {
@Override
public OffsetDateTime deserialize(JsonElement json, Type typeOfTarget, JsonDeserializationContext context) throws JsonParseException {
final String[] encoding = json.getAsJsonPrimitive().getAsString().split(";");
final Date date = new Date(Long.parseLong(encoding[0]));
return date.toInstant().atOffset(ZoneOffset.of(encoding[1]));
}
}}