diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt index cd6571733..dc8951eda 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/util/JsonUtil.kt @@ -7,6 +7,7 @@ import com.google.gson.JsonParser import com.google.gson.JsonPrimitive import com.google.gson.JsonSerializationContext import com.google.gson.JsonSerializer +import com.google.gson.ToNumberPolicy import com.google.gson.reflect.TypeToken import com.v2ray.ang.AppConfig import java.lang.reflect.Type @@ -64,12 +65,15 @@ object JsonUtil { val gsonPre = GsonBuilder() .setPrettyPrinting() .disableHtmlEscaping() + .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE) .registerTypeAdapter( // custom serializer is needed here since JSON by default parse number as Double, core will fail to start object : TypeToken() {}.type, JsonSerializer { src: Double?, _: Type?, _: JsonSerializationContext? -> - JsonPrimitive( - src?.toInt() - ) + when (src) { + null -> null + src.toLong().toDouble() -> JsonPrimitive(src.toLong()) + else -> JsonPrimitive(src) + } } ) .create() diff --git a/V2rayNG/app/src/test/java/com/v2ray/ang/util/JsonUtilTest.kt b/V2rayNG/app/src/test/java/com/v2ray/ang/util/JsonUtilTest.kt new file mode 100644 index 000000000..f209eab81 --- /dev/null +++ b/V2rayNG/app/src/test/java/com/v2ray/ang/util/JsonUtilTest.kt @@ -0,0 +1,24 @@ +package com.v2ray.ang.util + +import com.google.gson.JsonParser +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Test + +class JsonUtilTest { + + @Test + fun toJsonPrettyKeepsNumbersOfConfigArrayElements() { + val configs = JsonUtil.fromJson( + """[{"port":443,"tolerance":0.4,"offset":-0.5,"timestamp":1700000000000,"name":"0.4"}]""", + Array::class.java + ) + + val output = JsonParser.parseString(JsonUtil.toJsonPretty(configs!![0])).asJsonObject + + assertEquals("443", output["port"].asString) + assertEquals("0.4", output["tolerance"].asString) + assertEquals("-0.5", output["offset"].asString) + assertEquals("1700000000000", output["timestamp"].asString) + assertEquals("0.4", output["name"].asString) + } +}