提问者:小点点

将JSON字符串转换为任何原始类型或JSONObject的Map


我试图将提供的字符串(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"
    }
}

它被转换为一个键和多个带有字符串的“任何”值,但在这种情况下,我希望该值不仅仅是一个条目


共1个答案

匿名用户

您可以通过将预期类型指定为Map来做到这一点

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)