multi gson
This commit is contained in:
72
src/main/java/me/cortex/voxy/common/util/MultiGson.java
Normal file
72
src/main/java/me/cortex/voxy/common/util/MultiGson.java
Normal file
@@ -0,0 +1,72 @@
|
||||
package me.cortex.voxy.common.util;
|
||||
|
||||
import com.google.gson.*;
|
||||
|
||||
import java.lang.reflect.Modifier;
|
||||
import java.util.*;
|
||||
|
||||
public class MultiGson {
|
||||
private final List<Class<?>> classes;
|
||||
private final Gson GSON = new GsonBuilder()
|
||||
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
|
||||
.setPrettyPrinting()
|
||||
.excludeFieldsWithModifiers(Modifier.PRIVATE)
|
||||
.create();
|
||||
|
||||
private MultiGson(List<Class<?>> classes) {
|
||||
this.classes = classes;
|
||||
}
|
||||
|
||||
public String toJson(Object... objects) {
|
||||
Object[] map = new Object[this.classes.size()];
|
||||
if (map.length != objects.length) {
|
||||
throw new IllegalArgumentException("Incorrect number of input args");
|
||||
}
|
||||
for (var obj : objects) {
|
||||
if (obj == null) {
|
||||
throw new IllegalArgumentException();
|
||||
}
|
||||
int i = this.classes.indexOf(obj.getClass());
|
||||
if (i == -1) {
|
||||
throw new IllegalArgumentException("Unknown object class: " + obj.getClass());
|
||||
}
|
||||
if (map[i] != null) {
|
||||
throw new IllegalArgumentException("Duplicate entry classes");
|
||||
}
|
||||
}
|
||||
|
||||
var json = new JsonObject();
|
||||
for (Object entry : map) {
|
||||
GSON.toJsonTree(entry).getAsJsonObject().asMap().forEach((i,j) -> {
|
||||
if (json.has(i)) {
|
||||
throw new IllegalArgumentException("Duplicate name inside unified json: " + i);
|
||||
}
|
||||
json.add(i, j);
|
||||
});
|
||||
}
|
||||
return GSON.toJson(json);
|
||||
}
|
||||
|
||||
public Map<Class<?>, Object> fromJson(String json) {
|
||||
var obj = GSON.fromJson(json, JsonObject.class);
|
||||
LinkedHashMap<Class<?>, Object> objects = new LinkedHashMap<>();
|
||||
for (var cls : this.classes) {
|
||||
objects.put(cls, GSON.fromJson(obj, cls));
|
||||
}
|
||||
return objects;
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
private final LinkedHashSet<Class<?>> classes = new LinkedHashSet<>();
|
||||
public Builder add(Class<?> clz) {
|
||||
if (!this.classes.add(clz)) {
|
||||
throw new IllegalArgumentException("Class has already been added");
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public MultiGson build() {
|
||||
return new MultiGson(new ArrayList<>(this.classes));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user