Skip to content

Commit 1fadca8

Browse files
committed
Add JsonUtil
1 parent af01e2a commit 1fadca8

File tree

11 files changed

+89
-61
lines changed

11 files changed

+89
-61
lines changed

V2rayNG/app/src/main/kotlin/com/v2ray/ang/service/V2RayTestService.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ package com.v2ray.ang.service
33
import android.app.Service
44
import android.content.Intent
55
import android.os.IBinder
6-
import com.google.gson.Gson
76
import com.v2ray.ang.AppConfig.MSG_MEASURE_CONFIG
87
import com.v2ray.ang.AppConfig.MSG_MEASURE_CONFIG_CANCEL
98
import com.v2ray.ang.AppConfig.MSG_MEASURE_CONFIG_SUCCESS
109
import com.v2ray.ang.dto.ConfigResult
1110
import com.v2ray.ang.extension.serializable
11+
import com.v2ray.ang.util.JsonUtil
1212
import com.v2ray.ang.util.MessageUtil
1313
import com.v2ray.ang.util.SpeedtestUtil
1414
import com.v2ray.ang.util.Utils
@@ -33,8 +33,8 @@ class V2RayTestService : Service() {
3333
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
3434
when (intent?.getIntExtra("key", 0)) {
3535
MSG_MEASURE_CONFIG -> {
36-
val content = intent.serializable<String>("content")
37-
val config = Gson().fromJson(content, ConfigResult::class.java)
36+
val content = intent.serializable<String>("content") ?: ""
37+
val config = JsonUtil.fromJson(content, ConfigResult::class.java)
3838
realTestScope.launch {
3939
val result = SpeedtestUtil.realPing(config.content)
4040
MessageUtil.sendMsg2UI(this@V2RayTestService, MSG_MEASURE_CONFIG_SUCCESS, Pair(config.guid, result))

V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/RoutingSettingActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,14 @@ import androidx.appcompat.app.AlertDialog
1010
import androidx.lifecycle.lifecycleScope
1111
import androidx.recyclerview.widget.ItemTouchHelper
1212
import androidx.recyclerview.widget.LinearLayoutManager
13-
import com.google.gson.Gson
13+
1414
import com.v2ray.ang.AppConfig
1515
import com.v2ray.ang.R
1616
import com.v2ray.ang.databinding.ActivityRoutingSettingBinding
1717
import com.v2ray.ang.dto.RulesetItem
1818
import com.v2ray.ang.extension.toast
1919
import com.v2ray.ang.helper.SimpleItemTouchHelperCallback
20+
import com.v2ray.ang.util.JsonUtil
2021
import com.v2ray.ang.util.MmkvManager
2122
import com.v2ray.ang.util.MmkvManager.settingsStorage
2223
import com.v2ray.ang.util.SettingsManager
@@ -141,7 +142,7 @@ class RoutingSettingActivity : BaseActivity() {
141142
if (rulesetList.isNullOrEmpty()) {
142143
toast(R.string.toast_failure)
143144
} else {
144-
Utils.setClipboard(this, Gson().toJson(rulesetList))
145+
Utils.setClipboard(this, JsonUtil.toJson(rulesetList))
145146
toast(R.string.toast_success)
146147
}
147148
true

V2rayNG/app/src/main/kotlin/com/v2ray/ang/ui/ServerCustomConfigActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ import android.widget.Toast
88
import androidx.appcompat.app.AlertDialog
99
import com.blacksquircle.ui.editorkit.utils.EditorTheme
1010
import com.blacksquircle.ui.language.json.JsonLanguage
11-
import com.google.gson.Gson
11+
1212
import com.v2ray.ang.R
1313
import com.v2ray.ang.databinding.ActivityServerCustomConfigBinding
1414
import com.v2ray.ang.dto.EConfigType
1515
import com.v2ray.ang.dto.ServerConfig
1616
import com.v2ray.ang.dto.V2rayConfig
1717
import com.v2ray.ang.extension.toast
18+
import com.v2ray.ang.util.JsonUtil
1819
import com.v2ray.ang.util.MmkvManager
1920
import com.v2ray.ang.util.Utils
2021
import me.drakeet.support.toast.ToastCompat
@@ -78,7 +79,7 @@ class ServerCustomConfigActivity : BaseActivity() {
7879
}
7980

8081
val v2rayConfig = try {
81-
Gson().fromJson(binding.editor.text.toString(), V2rayConfig::class.java)
82+
JsonUtil.fromJson(binding.editor.text.toString(), V2rayConfig::class.java)
8283
} catch (e: Exception) {
8384
e.printStackTrace()
8485
ToastCompat.makeText(this, "${getString(R.string.toast_malformed_josn)} ${e.cause?.message}", Toast.LENGTH_LONG).show()

V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/AngConfigManager.kt

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import android.content.Context
44
import android.graphics.Bitmap
55
import android.text.TextUtils
66
import android.util.Log
7-
import com.google.gson.Gson
7+
88
import com.google.gson.GsonBuilder
99
import com.google.gson.JsonPrimitive
1010
import com.google.gson.JsonSerializationContext
@@ -278,34 +278,21 @@ object AngConfigManager {
278278
&& server.contains("routing")
279279
) {
280280
try {
281-
//val gson = GsonBuilder().setPrettyPrinting().create()
282-
val gson = GsonBuilder()
283-
.setPrettyPrinting()
284-
.disableHtmlEscaping()
285-
.registerTypeAdapter( // custom serialiser is needed here since JSON by default parse number as Double, core will fail to start
286-
object : TypeToken<Double>() {}.type,
287-
JsonSerializer { src: Double?, _: Type?, _: JsonSerializationContext? ->
288-
JsonPrimitive(
289-
src?.toInt()
290-
)
291-
}
292-
)
293-
.create()
294281
val serverList: Array<Any> =
295-
Gson().fromJson(server, Array<Any>::class.java)
282+
JsonUtil.fromJson(server, Array<Any>::class.java)
296283

297284
if (serverList.isNotEmpty()) {
298285
var count = 0
299286
for (srv in serverList.reversed()) {
300287
val config = ServerConfig.create(EConfigType.CUSTOM)
301288
config.fullConfig =
302-
Gson().fromJson(Gson().toJson(srv), V2rayConfig::class.java)
289+
JsonUtil.fromJson(JsonUtil.toJson(srv), V2rayConfig::class.java)
303290
config.remarks = config.fullConfig?.remarks
304291
?: ("%04d-".format(count + 1) + System.currentTimeMillis()
305292
.toString())
306293
config.subscriptionId = subid
307294
val key = MmkvManager.encodeServerConfig("", config)
308-
MmkvManager.encodeServerRaw(key, gson.toJson(srv))
295+
MmkvManager.encodeServerRaw(key, JsonUtil.toJsonPretty(srv))
309296
count += 1
310297
}
311298
return count
@@ -318,7 +305,7 @@ object AngConfigManager {
318305
// For compatibility
319306
val config = ServerConfig.create(EConfigType.CUSTOM)
320307
config.subscriptionId = subid
321-
config.fullConfig = Gson().fromJson(server, V2rayConfig::class.java)
308+
config.fullConfig = JsonUtil.fromJson(server, V2rayConfig::class.java)
322309
config.remarks = config.fullConfig?.remarks ?: System.currentTimeMillis().toString()
323310
val key = MmkvManager.encodeServerConfig("", config)
324311
MmkvManager.encodeServerRaw(key, server)
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package com.v2ray.ang.util
2+
3+
import com.google.gson.Gson
4+
import com.google.gson.GsonBuilder
5+
import com.google.gson.JsonPrimitive
6+
import com.google.gson.JsonSerializationContext
7+
import com.google.gson.JsonSerializer
8+
import com.google.gson.reflect.TypeToken
9+
import java.lang.reflect.Type
10+
11+
object JsonUtil {
12+
private var gson = Gson()
13+
14+
fun toJson(src: Any?): String {
15+
return gson.toJson(src)
16+
}
17+
18+
fun <T> fromJson(json: String, cls: Class<T>): T {
19+
return gson.fromJson(json, cls)
20+
}
21+
22+
fun toJsonPretty(src: Any?): String {
23+
val gsonPre = GsonBuilder()
24+
.setPrettyPrinting()
25+
.disableHtmlEscaping()
26+
.registerTypeAdapter( // custom serialiser is needed here since JSON by default parse number as Double, core will fail to start
27+
object : TypeToken<Double>() {}.type,
28+
JsonSerializer { src: Double?, _: Type?, _: JsonSerializationContext? ->
29+
JsonPrimitive(
30+
src?.toInt()
31+
)
32+
}
33+
)
34+
.create()
35+
return gsonPre.toJson(src)
36+
}
37+
}

V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/MmkvManager.kt

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.v2ray.ang.util
22

3-
import com.google.gson.Gson
3+
44
import com.tencent.mmkv.MMKV
55
import com.v2ray.ang.AppConfig.PREF_IS_BOOTED
66
import com.v2ray.ang.AppConfig.PREF_ROUTING_RULESET
@@ -49,15 +49,15 @@ object MmkvManager {
4949
}
5050

5151
fun encodeServerList(serverList: MutableList<String>) {
52-
mainStorage.encode(KEY_ANG_CONFIGS, Gson().toJson(serverList))
52+
mainStorage.encode(KEY_ANG_CONFIGS, JsonUtil.toJson(serverList))
5353
}
5454

5555
fun decodeServerList(): MutableList<String> {
5656
val json = mainStorage.decodeString(KEY_ANG_CONFIGS)
5757
return if (json.isNullOrBlank()) {
5858
mutableListOf()
5959
} else {
60-
Gson().fromJson(json, Array<String>::class.java).toMutableList()
60+
JsonUtil.fromJson(json, Array<String>::class.java).toMutableList()
6161
}
6262
}
6363

@@ -69,7 +69,7 @@ object MmkvManager {
6969
if (json.isNullOrBlank()) {
7070
return null
7171
}
72-
return Gson().fromJson(json, ServerConfig::class.java)
72+
return JsonUtil.fromJson(json, ServerConfig::class.java)
7373
}
7474

7575
fun decodeProfileConfig(guid: String): ProfileItem? {
@@ -80,12 +80,12 @@ object MmkvManager {
8080
if (json.isNullOrBlank()) {
8181
return null
8282
}
83-
return Gson().fromJson(json, ProfileItem::class.java)
83+
return JsonUtil.fromJson(json, ProfileItem::class.java)
8484
}
8585

8686
fun encodeServerConfig(guid: String, config: ServerConfig): String {
8787
val key = guid.ifBlank { Utils.getUuid() }
88-
serverStorage.encode(key, Gson().toJson(config))
88+
serverStorage.encode(key, JsonUtil.toJson(config))
8989
val serverList = decodeServerList()
9090
if (!serverList.contains(key)) {
9191
serverList.add(0, key)
@@ -101,7 +101,7 @@ object MmkvManager {
101101
server = config.getProxyOutbound()?.getServerAddress(),
102102
serverPort = config.getProxyOutbound()?.getServerPort(),
103103
)
104-
profileStorage.encode(key, Gson().toJson(profile))
104+
profileStorage.encode(key, JsonUtil.toJson(profile))
105105
return key
106106
}
107107

@@ -141,7 +141,7 @@ object MmkvManager {
141141
if (json.isNullOrBlank()) {
142142
return null
143143
}
144-
return Gson().fromJson(json, ServerAffiliationInfo::class.java)
144+
return JsonUtil.fromJson(json, ServerAffiliationInfo::class.java)
145145
}
146146

147147
fun encodeServerTestDelayMillis(guid: String, testResult: Long) {
@@ -150,14 +150,14 @@ object MmkvManager {
150150
}
151151
val aff = decodeServerAffiliationInfo(guid) ?: ServerAffiliationInfo()
152152
aff.testDelayMillis = testResult
153-
serverAffStorage.encode(guid, Gson().toJson(aff))
153+
serverAffStorage.encode(guid, JsonUtil.toJson(aff))
154154
}
155155

156156
fun clearAllTestDelayResults(keys: List<String>?) {
157157
keys?.forEach { key ->
158158
decodeServerAffiliationInfo(key)?.let { aff ->
159159
aff.testDelayMillis = 0
160-
serverAffStorage.encode(key, Gson().toJson(aff))
160+
serverAffStorage.encode(key, JsonUtil.toJson(aff))
161161
}
162162
}
163163
}
@@ -217,7 +217,7 @@ object MmkvManager {
217217
decodeSubsList().forEach { key ->
218218
val json = subStorage.decodeString(key)
219219
if (!json.isNullOrBlank()) {
220-
subscriptions.add(Pair(key, Gson().fromJson(json, SubscriptionItem::class.java)))
220+
subscriptions.add(Pair(key, JsonUtil.fromJson(json, SubscriptionItem::class.java)))
221221
}
222222
}
223223
return subscriptions
@@ -234,7 +234,7 @@ object MmkvManager {
234234

235235
fun encodeSubscription(guid: String, subItem: SubscriptionItem) {
236236
val key = guid.ifBlank { Utils.getUuid() }
237-
subStorage.encode(key, Gson().toJson(subItem))
237+
subStorage.encode(key, JsonUtil.toJson(subItem))
238238

239239
val subsList = decodeSubsList()
240240
if (!subsList.contains(key)) {
@@ -245,19 +245,19 @@ object MmkvManager {
245245

246246
fun decodeSubscription(subscriptionId: String): SubscriptionItem? {
247247
val json = subStorage.decodeString(subscriptionId) ?: return null
248-
return Gson().fromJson(json, SubscriptionItem::class.java)
248+
return JsonUtil.fromJson(json, SubscriptionItem::class.java)
249249
}
250250

251251
fun encodeSubsList(subsList: MutableList<String>) {
252-
mainStorage.encode(KEY_SUB_IDS, Gson().toJson(subsList))
252+
mainStorage.encode(KEY_SUB_IDS, JsonUtil.toJson(subsList))
253253
}
254254

255255
fun decodeSubsList(): MutableList<String> {
256256
val json = mainStorage.decodeString(KEY_SUB_IDS)
257257
return if (json.isNullOrBlank()) {
258258
mutableListOf()
259259
} else {
260-
Gson().fromJson(json, Array<String>::class.java).toMutableList()
260+
JsonUtil.fromJson(json, Array<String>::class.java).toMutableList()
261261
}
262262
}
263263

@@ -270,7 +270,7 @@ object MmkvManager {
270270
assetStorage.allKeys()?.forEach { key ->
271271
val json = assetStorage.decodeString(key)
272272
if (!json.isNullOrBlank()) {
273-
assetUrlItems.add(Pair(key, Gson().fromJson(json, AssetUrlItem::class.java)))
273+
assetUrlItems.add(Pair(key, JsonUtil.fromJson(json, AssetUrlItem::class.java)))
274274
}
275275
}
276276
return assetUrlItems.sortedBy { (_, value) -> value.addedTime }
@@ -282,12 +282,12 @@ object MmkvManager {
282282

283283
fun encodeAsset(assetid: String, assetItem: AssetUrlItem) {
284284
val key = assetid.ifBlank { Utils.getUuid() }
285-
assetStorage.encode(key, Gson().toJson(assetItem))
285+
assetStorage.encode(key, JsonUtil.toJson(assetItem))
286286
}
287287

288288
fun decodeAsset(assetid: String): AssetUrlItem? {
289289
val json = assetStorage.decodeString(assetid) ?: return null
290-
return Gson().fromJson(json, AssetUrlItem::class.java)
290+
return JsonUtil.fromJson(json, AssetUrlItem::class.java)
291291
}
292292

293293
//endregion
@@ -297,14 +297,14 @@ object MmkvManager {
297297
fun decodeRoutingRulesets(): MutableList<RulesetItem>? {
298298
val ruleset = settingsStorage.decodeString(PREF_ROUTING_RULESET)
299299
if (ruleset.isNullOrEmpty()) return null
300-
return Gson().fromJson(ruleset, Array<RulesetItem>::class.java).toMutableList()
300+
return JsonUtil.fromJson(ruleset, Array<RulesetItem>::class.java).toMutableList()
301301
}
302302

303303
fun encodeRoutingRulesets(rulesetList: MutableList<RulesetItem>?) {
304304
if (rulesetList.isNullOrEmpty())
305305
settingsStorage.encode(PREF_ROUTING_RULESET, "")
306306
else
307-
settingsStorage.encode(PREF_ROUTING_RULESET, Gson().toJson(rulesetList))
307+
settingsStorage.encode(PREF_ROUTING_RULESET, JsonUtil.toJson(rulesetList))
308308
}
309309

310310
//endregion

V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/PluginUtil.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package com.v2ray.ang.util
33
import android.content.Context
44
import android.os.SystemClock
55
import android.util.Log
6-
import com.google.gson.Gson
6+
77
import com.v2ray.ang.AppConfig.ANG_PACKAGE
88
import com.v2ray.ang.dto.EConfigType
99
import com.v2ray.ang.dto.ServerConfig
@@ -38,8 +38,8 @@ object PluginUtil {
3838
Log.d(packageName, "runPlugin ${configFile.absolutePath}")
3939

4040
configFile.parentFile?.mkdirs()
41-
configFile.writeText(Gson().toJson(hy2Config))
42-
Log.d(packageName, Gson().toJson(hy2Config))
41+
configFile.writeText(JsonUtil.toJson(hy2Config))
42+
Log.d(packageName, JsonUtil.toJson(hy2Config))
4343

4444
runHy2(context, configFile)
4545
}

V2rayNG/app/src/main/kotlin/com/v2ray/ang/util/SettingsManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package com.v2ray.ang.util
22

33
import android.content.Context
44
import android.text.TextUtils
5-
import com.google.gson.Gson
5+
66
import com.v2ray.ang.AppConfig
77
import com.v2ray.ang.dto.RulesetItem
88
import com.v2ray.ang.dto.ServerConfig
@@ -35,7 +35,7 @@ object SettingsManager {
3535
return null
3636
}
3737

38-
return Gson().fromJson(assets, Array<RulesetItem>::class.java).toMutableList()
38+
return JsonUtil.fromJson(assets, Array<RulesetItem>::class.java).toMutableList()
3939
}
4040

4141
fun resetRoutingRulesets(context: Context, index: Int) {
@@ -49,7 +49,7 @@ object SettingsManager {
4949
}
5050

5151
try {
52-
val rulesetList = Gson().fromJson(content, Array<RulesetItem>::class.java).toMutableList()
52+
val rulesetList = JsonUtil.fromJson(content, Array<RulesetItem>::class.java).toMutableList()
5353
if (rulesetList.isNullOrEmpty()) {
5454
return false
5555
}

0 commit comments

Comments
 (0)