如何使用 Moshi 将 json 字符串序列化为 org.json.JSONObject?

How do I use Moshi to serialize a json string into org.json.JSONObject?

我的服务器有一个 JSON 响应,它本质上是动态的,我无法将其映射到 Kotlin 数据 Class。

我想从中创建一个 org.json.JSONObject 并从那里解析它。 我查看了 SO 和 Moshi 的文档,但找不到任何简单的方法来实现这一点。

有什么建议吗?

我最近偶然发现了同样的问题。我需要将一些数据从一个端点重新发送到另一个端点,并向其中添加一些新内容。

来自服务器的响应如下所示:

{
    "someProperty": "value",
    "someOtherProperty": "otherValue",
    "someDynamicProperty": {
        // There may be anything including nested structures, not known beforehand
    }
}

通常情况下,Moshi 没有对此类内容的内置支持,但它允许您构建自己的适配器并处理解析逻辑。

您需要定义您希望接收的结果类型:

@JsonClass(generateAdapter = true)
data class CustomResponse(
    val someProperty: String,
    val someOtherProperty: String,
    val someDynamicProperty: JSONObject?
)

然后,您需要创建一个自定义适配器来处理解析:

internal object JSONObjectAdapter {

    @FromJson
    fun fromJson(reader: JsonReader): JSONObject? {
        // Here we're expecting the JSON object, it is processed as Map<String, Any> by Moshi
        return (reader.readJsonValue() as? Map<String, Any>)?.let { data ->
            try {
                JSONObject(data)
            } catch (e: JSONException) {
                // Handle error if arises
            }
        }
    }

    @ToJson
    fun toJson(writer: JsonWriter, value: JSONObject?) {
        value?.let { writer.value(Buffer().writeUtf8(value.toString())) }
    }
}

然后,只需在创建时将此适配器添加到 Moshi 构建器:

Moshi.Builder().add(JSONObjectAdapter).build()

如果您只想将其应用于某些特定属性,则可以使用 Moshi 注释。