我使用 Apollo Android 库 来查询 GraphQL 端点。 一切正常,直到我尝试将结果转换回 JSON 字符串(将它们存储在 Room 数据库 中)。我天真地尝试使用 Moshi,但是失败并出现以下错误:
无法获取可用的额外产品:com.example.MyQuery$MyFragmentInterface 接口没有 JsonAdapter
其中
MyFragmentInterface
在 Apollo 生成的用于处理查询片段的接口中。
因此,我尝试查找 Apollo 库是否有/生成任何转换方法,即像
toJson()
/fromJson()
这样的转换方法,用于生成的模型,但是我找不到任何可用的东西。
我错过了一些明显的东西吗?
自 Apollo 1.3.x 起,Java 中有一个
Operation.Data.toJson()
扩展函数 (Kotlin) 和相应的 serialize
静态方法。
检查https://www.apollographql.com/docs/android/advanced/no-runtime/#converting-querydata-back-to-json
对于相反的,Json 字符串到
Query.Data
,我使用如下所示的内容:
import okio.Buffer
fun String?.toMyData(): MyQuery.Data? {
this ?: return null
val query = MyQuery()
val response: Response<MyQuery.Data> =
OperationResponseParser(query,
query.responseFieldMapper(),
ScalarTypeAdapters.DEFAULT)
.parse(Buffer().writeUtf8(this))
return response.data
}
这是一个如何将字符串反序列化为生成对象的示例。内嵌评论以获取更多详细信息。
// Sample string response
val jsonResponse = """
{
"data": {
{
"id": "isbn-889-333",
"title": "Awesome title",
"rating": 5
}
}
""".trimIndent()
// Create query that is expect to return above response
val query = QueryBookDetails("book_id")
// convert string to input stream
val inputStream = ByteArrayInputStream(jsonResponse.toByteArray())
// Read bytes into okio buffer
val buffer = Buffer().readFrom(inputStream)
// Use the query to parse the buffer.
val response = query.parse(buffer)
// response.data might be the one needed by you
请记住,响应必须遵循架构。