gson 将JSON字符串转换为具有任何基元类型或JSONObject的Map

nfg76nw0  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(172)

我正在尝试将提供的字符串(JSON)转换为Map〈String,Any〉,例如JSON可以是这样的(值可以是任何原语类型或集合,如Map集或数组:

{
    "key": "thisIsMyKey",
    "value": false
}

所以我用GSON把它转换成了这个小片段:

return jsonMap?.let { Gson().fromJson(jsonMap, object : TypeToken<HashMap<String, Any>>() {}.type) }

我现在遇到的问题是,如果我想用JSONObject传递值,那么下面的示例

{
    "key": "thisIsMyKey",
    "value": {
        "title": "this is title"
    }
}

它被转换为一个键和多个“任何”值与字符串,但在这种情况下,我希望该值不仅仅是一个条目〈String,JSONObject),任何提示如何实现这一级太深的转换?

crcmnpdw

crcmnpdw1#

您可以通过将预期类型指定为Map<String, JsonElement>来实现此目的。此方法的缺点是基元类型(NumberStringBoolean)的值将被 Package 到JsonPrimitive中。如果无法接受,您可以手动将其解 Package :

val result = jsonMap?.let {
    Gson().fromJson<Map<String, JsonElement>>(jsonMap).mapValues { (_, v) -> deprimitivize(v) }
}

fun deprimitivize(e: JsonElement) = if (e is JsonPrimitive) e.getValue() else e

fun JsonPrimitive.getValue(): Any = when {
    isBoolean -> asBoolean
    isNumber -> asNumber
    else -> asString
}

inline fun <reified T : Any> Gson.fromJson(json: String): T = fromJson(json, object : TypeToken<T>() {}.type)

相关问题