feat: 为 GSON 工具添加 component 支持

This commit is contained in:
2023-06-04 16:37:21 +08:00
parent 094eb0a671
commit 4bae28d8e2
3 changed files with 31 additions and 0 deletions

View File

@@ -13,10 +13,12 @@ import cn.hamster3.mc.plugin.core.bukkit.page.listener.PageListener;
import cn.hamster3.mc.plugin.core.bukkit.util.serializer.ItemStackAdapter;
import cn.hamster3.mc.plugin.core.bukkit.util.serializer.PotionEffectAdapter;
import cn.hamster3.mc.plugin.core.common.data.DisplayMessage;
import cn.hamster3.mc.plugin.core.common.util.serializer.ComponentTypeAdapter;
import cn.hamster3.mc.plugin.core.common.util.serializer.MessageTypeAdapter;
import cn.hamster3.mc.plugin.core.common.util.CoreUtils;
import com.google.gson.GsonBuilder;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import net.kyori.adventure.text.Component;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
@@ -46,6 +48,7 @@ public class HamsterCorePlugin extends JavaPlugin {
reloadConfig();
logger.info("已读取配置文件.");
CoreUtils.GSON = new GsonBuilder()
.registerTypeAdapter(Component.class, ComponentTypeAdapter.INSTANCE)
.registerTypeAdapter(DisplayMessage.class, MessageTypeAdapter.INSTANCE)
.registerTypeAdapter(ItemStack.class, ItemStackAdapter.INSTANCE)
.registerTypeAdapter(PotionEffect.class, PotionEffectAdapter.INSTANCE)

View File

@@ -1,6 +1,7 @@
package cn.hamster3.mc.plugin.core.common.util;
import cn.hamster3.mc.plugin.core.common.data.DisplayMessage;
import cn.hamster3.mc.plugin.core.common.util.serializer.ComponentTypeAdapter;
import cn.hamster3.mc.plugin.core.common.util.serializer.MessageTypeAdapter;
import cn.hamster3.mc.plugin.core.common.thread.NamedThreadFactory;
import com.google.gson.Gson;
@@ -8,6 +9,7 @@ import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
import net.kyori.adventure.key.Key;
import net.kyori.adventure.sound.Sound;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import net.kyori.adventure.title.Title;
import org.jetbrains.annotations.NotNull;
@@ -37,12 +39,14 @@ public final class CoreUtils {
* GSON 工具
*/
public static Gson GSON = new GsonBuilder()
.registerTypeAdapter(Component.class, ComponentTypeAdapter.INSTANCE)
.registerTypeAdapter(DisplayMessage.class, MessageTypeAdapter.INSTANCE)
.create();
/**
* GSON 工具会使用格式化输出、且解析中包含null参数
*/
public static Gson GSON_HUMAN = new GsonBuilder()
.registerTypeAdapter(Component.class, ComponentTypeAdapter.INSTANCE)
.registerTypeAdapter(DisplayMessage.class, MessageTypeAdapter.INSTANCE)
.serializeNulls()
.setPrettyPrinting()

View File

@@ -0,0 +1,24 @@
package cn.hamster3.mc.plugin.core.common.util.serializer;
import com.google.gson.*;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
import java.lang.reflect.Type;
public class ComponentTypeAdapter implements JsonSerializer<Component>, JsonDeserializer<Component> {
public static final ComponentTypeAdapter INSTANCE = new ComponentTypeAdapter();
private ComponentTypeAdapter() {
}
@Override
public Component deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return GsonComponentSerializer.gson().deserializeFromTree(json);
}
@Override
public JsonElement serialize(Component src, Type typeOfSrc, JsonSerializationContext context) {
return GsonComponentSerializer.gson().serializeToTree(src);
}
}