From d53033f759d557d6967bd9be68a472f71488f517 Mon Sep 17 00:00:00 2001 From: MrXiaoM Date: Sat, 18 May 2024 19:42:33 +0800 Subject: [PATCH] move json serialize to JsonHelper, fix null checks --- onebot/src/main/kotlin/client/core/Bot.kt | 41 ------------------ onebot/src/main/kotlin/sdk/util/JsonHelper.kt | 42 ++++++++++++++++++- 2 files changed, 40 insertions(+), 43 deletions(-) diff --git a/onebot/src/main/kotlin/client/core/Bot.kt b/onebot/src/main/kotlin/client/core/Bot.kt index 69366ce9..d183ad2c 100644 --- a/onebot/src/main/kotlin/client/core/Bot.kt +++ b/onebot/src/main/kotlin/client/core/Bot.kt @@ -20,7 +20,6 @@ import cn.evolvefield.onebot.sdk.util.* import cn.evolvefield.onebot.client.config.BotConfig import cn.evolvefield.onebot.client.handler.ActionHandler import com.google.gson.* -import com.google.gson.reflect.TypeToken import me.him188.kotlin.jvm.blocking.bridge.JvmBlockingBridge import org.java_websocket.WebSocket @@ -1430,43 +1429,3 @@ class Bot( return result.withClass() } } - -fun List.toJsonArray(): JsonArray { - val array = JsonArray() - for (any in this) { - when (any) { - is JsonElement -> array.add(any) - is Map<*, *> -> array.add(any.toJsonObject()) - is List<*> -> array.add(any.toJsonArray()) - is Boolean -> array.add(any) - is Number -> array.add(any) - is Char -> array.add(any) - else -> array.add(any.toString()) - } - } - return array -} -fun Map.toJsonObject(): JsonObject { - val obj = JsonObject() - for (entry in entries) { - val key = entry.key.toString() - when (val value = entry.value) { - is JsonElement -> obj.add(key, value) - is Map<*, *> -> obj.add(key, value.toJsonObject()) - is List<*> -> obj.add(key, value.toJsonArray()) - is Boolean -> obj.addProperty(key, value) - is Number -> obj.addProperty(key, value) - is Char -> obj.addProperty(key, value) - else -> obj.addProperty(key, value.toString()) - } - } - return obj -} - -inline fun JsonElement.withToken(): T { - return gson.fromJson(this, object : TypeToken() {}.type) -} - -inline fun JsonElement.withClass(): T { - return gson.fromJson(this, T::class.java) -} diff --git a/onebot/src/main/kotlin/sdk/util/JsonHelper.kt b/onebot/src/main/kotlin/sdk/util/JsonHelper.kt index 6df76067..95dbbd4f 100644 --- a/onebot/src/main/kotlin/sdk/util/JsonHelper.kt +++ b/onebot/src/main/kotlin/sdk/util/JsonHelper.kt @@ -1,6 +1,7 @@ package cn.evolvefield.onebot.sdk.util import com.google.gson.* +import com.google.gson.reflect.TypeToken import java.util.function.Supplier val gson: Gson = GsonBuilder().setPrettyPrinting().create() @@ -108,10 +109,16 @@ fun JsonObject.forceString(key: String): String { } fun JsonObject.fromJson(key: String, type: Class): T? { - return gson.fromJson(this[key].deepCopyIgnoreNulls(), type) + return gson.fromJson(this[key], type) } inline fun JsonObject.fromJson(key: String): T? { - return gson.fromJson(this[key].deepCopyIgnoreNulls(), T::class.java) + return gson.fromJson(this[key], T::class.java) +} +inline fun JsonElement.withToken(): T { + return gson.fromJson(deepCopyIgnoreNulls(), object : TypeToken() {}.type) +} +inline fun JsonElement.withClass(): T { + return gson.fromJson(deepCopyIgnoreNulls(), T::class.java) } fun JsonElement?.deepCopyIgnoreNulls(): JsonElement? { if (this == null) return null @@ -143,5 +150,36 @@ fun ignoreNulls(json: JsonElement): JsonElement? { else -> null } } +fun List.toJsonArray(): JsonArray { + val array = JsonArray() + for (any in this) { + when (any) { + is JsonElement -> array.add(any) + is Map<*, *> -> array.add(any.toJsonObject()) + is List<*> -> array.add(any.toJsonArray()) + is Boolean -> array.add(any) + is Number -> array.add(any) + is Char -> array.add(any) + else -> array.add(any.toString()) + } + } + return array +} +fun Map.toJsonObject(): JsonObject { + val obj = JsonObject() + for (entry in entries) { + val key = entry.key.toString() + when (val value = entry.value) { + is JsonElement -> obj.add(key, value) + is Map<*, *> -> obj.add(key, value.toJsonObject()) + is List<*> -> obj.add(key, value.toJsonArray()) + is Boolean -> obj.addProperty(key, value) + is Number -> obj.addProperty(key, value) + is Char -> obj.addProperty(key, value) + else -> obj.addProperty(key, value.toString()) + } + } + return obj +} val T.nullable: T? get() = this