diff --git a/README.md b/README.md index 299d9b5..903dcdb 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,13 @@ A JSON serialize/deserialize util for bukkit's ConfigurationSerialization. ### Basic usage -We cloud use `BukkitJSONSerializer#serializeToJSON(ConfigurationSerializable)` to serialize a object to JSON. +First, we should get the serializer instance or create a new one. + +```java + BukkitJSONSerializer serializer=BukkitJSONSerializer.get(); +``` + +Then, we cloud use `BukkitJSONSerializer#serializeToJSON(ConfigurationSerializable)` to serialize a object to JSON. ```jave Location location = new Location(Bukkit.getWorlds().get(0), -100.5, 100, 105.5); @@ -25,12 +31,14 @@ When we need to read the object, just use `BukkitJSONSerializer#deserializeSON(j string. ```java - Location deserialized=BukkitJSONSerializer.deserializeJSON(serialized,Location.class); + Location location = serializer.deserializeSON(json, Location.class); + // deserialized -> Location{world=world, x=-100.5, y=100, z=105.5, pitch=0.0, yaw=0.0} ``` Or use `BukkitJSONSerializer#deserializeSON(json,typeClass,defaultValue)` if we need a default value. ### JSONSerializable class + This project provided an interface `JSONSerializable` which provided a default method to serialize itself to JSON. ```java diff --git a/src/main/java/cc/carm/lib/bukkit/configuration/BukkitJSONSerializer.java b/src/main/java/cc/carm/lib/bukkit/configuration/BukkitJSONSerializer.java index 0920757..762b3ac 100644 --- a/src/main/java/cc/carm/lib/bukkit/configuration/BukkitJSONSerializer.java +++ b/src/main/java/cc/carm/lib/bukkit/configuration/BukkitJSONSerializer.java @@ -26,17 +26,27 @@ import java.util.Optional; */ public class BukkitJSONSerializer { - protected static final String TYPE_KEY = ConfigurationSerialization.SERIALIZED_TYPE_KEY; + public static final String TYPE_KEY = ConfigurationSerialization.SERIALIZED_TYPE_KEY; + public static final BukkitJSONSerializer INSTANCE = BukkitJSONSerializer.create(); - protected static Gson gson = new GsonBuilder().disableHtmlEscaping().create(); - protected static JsonParser parser = new JsonParser(); - - public static void setGson(Gson gson) { - BukkitJSONSerializer.gson = gson; + public static @NotNull BukkitJSONSerializer create() { + return create(new GsonBuilder().disableHtmlEscaping().create(), new JsonParser()); } - public static void setParser(JsonParser parser) { - BukkitJSONSerializer.parser = parser; + public static @NotNull BukkitJSONSerializer create(@NotNull Gson gson, @NotNull JsonParser parser) { + return new BukkitJSONSerializer(gson, parser); + } + + public static @NotNull BukkitJSONSerializer get() { + return BukkitJSONSerializer.INSTANCE; + } + + protected final @NotNull Gson gson; + protected final @NotNull JsonParser parser; + + public BukkitJSONSerializer(@NotNull Gson gson, @NotNull JsonParser parser) { + this.gson = gson; + this.parser = parser; } /** @@ -46,7 +56,7 @@ public class BukkitJSONSerializer { * @param {@link ConfigurationSerializable} object type. * @return Map containing serialized data */ - public static Map serializeToMap(T value) { + public Map serializeToMap(T value) { Map values = new LinkedHashMap<>(); // First, put tye type key; values.put(TYPE_KEY, ConfigurationSerialization.getAlias(value.getClass())); @@ -68,7 +78,7 @@ public class BukkitJSONSerializer { * @param {@link ConfigurationSerializable} object type. * @return JSON string containing serialized data. */ - public static String serializeToJSON(T value) { + public String serializeToJSON(T value) { return gson.toJson(serializeToMap(value)); } @@ -79,7 +89,7 @@ public class BukkitJSONSerializer { * @return Deserialized object. */ @Contract("null->null") - public static Object deserializeJSON(@Nullable String json) { + public Object deserializeJSON(@Nullable String json) { return deserializeJSON(json, (ConfigurationSerializable) null); } @@ -91,8 +101,8 @@ public class BukkitJSONSerializer { * @return Deserialized object. */ @Contract("_,!null->!null; null,null->null") - public static ConfigurationSerializable deserializeJSON(@Nullable String json, - @Nullable ConfigurationSerializable defaultValue) { + public ConfigurationSerializable deserializeJSON(@Nullable String json, + @Nullable ConfigurationSerializable defaultValue) { if (json == null) return defaultValue; Map args = jsonToMap(json); @@ -110,8 +120,8 @@ public class BukkitJSONSerializer { * @param {@link ConfigurationSerializable} object type. * @return Deserialized object. */ - public static @Nullable T deserializeJSON(@Nullable String json, - @NotNull Class typeClazz) { + public @Nullable T deserializeJSON(@Nullable String json, + @NotNull Class typeClazz) { return deserializeJSON(json, typeClazz, null); } @@ -125,24 +135,24 @@ public class BukkitJSONSerializer { * @return Deserialized object. */ @Contract("_,_,!null->!null; null,_,null->null") - public static T deserializeJSON(@Nullable String json, - @NotNull Class typeClazz, - @Nullable T defaultValue) { + public T deserializeJSON(@Nullable String json, + @NotNull Class typeClazz, + @Nullable T defaultValue) { Object value = deserializeJSON(json, defaultValue); if (!typeClazz.isInstance(value)) return defaultValue; return typeClazz.cast(value); } - protected static Map jsonToMap(String json) { + protected Map jsonToMap(String json) { return jsonToMap(parser.parse(json).getAsJsonObject()); } - protected static Map jsonToMap(JsonObject object) { + protected Map jsonToMap(JsonObject object) { return parseMap(gson.fromJson(object, Map.class)); } - protected static Map parseMap(Map map) { + protected Map parseMap(Map map) { Map args = new LinkedHashMap<>(); map.forEach((k, v) -> { String key = (String) k; diff --git a/src/main/java/cc/carm/lib/bukkit/configuration/JSONSerializable.java b/src/main/java/cc/carm/lib/bukkit/configuration/JSONSerializable.java index d5bb82a..317f2fb 100644 --- a/src/main/java/cc/carm/lib/bukkit/configuration/JSONSerializable.java +++ b/src/main/java/cc/carm/lib/bukkit/configuration/JSONSerializable.java @@ -11,7 +11,7 @@ public interface JSONSerializable extends ConfigurationSerializable { * @return JSON string contains serialized data. */ default @NotNull String serializeToJSON() { - return BukkitJSONSerializer.serializeToJSON(this); + return BukkitJSONSerializer.get().serializeToJSON(this); } } diff --git a/src/test/java/demo.java b/src/test/java/demo.java index ec076d6..976a894 100644 --- a/src/test/java/demo.java +++ b/src/test/java/demo.java @@ -10,13 +10,15 @@ import java.util.UUID; public class demo { public static void demoUsage() { + BukkitJSONSerializer serializer = BukkitJSONSerializer.create(); Location location = new Location(Bukkit.getWorlds().get(0), -100.5, 100, 105.5); - String serialized = BukkitJSONSerializer.serializeToJSON(location); + String serialized = serializer.serializeToJSON(location); // serialized -> {"world":"world","x":-100.5,"y":100,"z":105.5,"yaw":0.0,"pitch":0.0} - Location deserialized = BukkitJSONSerializer.deserializeJSON(serialized, Location.class); + Location deserialized = serializer.deserializeJSON(serialized, Location.class); + // deserialized -> Location{world=world, x=-100.5, y=100, z=105.5, pitch=0.0, yaw=0.0} }