如何使用 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 注释。
我的服务器有一个 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 注释。