如何手动将 Apollo Android 生成的对象转换为 JSON 字符串并返回?

问题描述 投票:0回答:3

我使用 Apollo Android 库 来查询 GraphQL 端点。 一切正常,直到我尝试将结果转换回 JSON 字符串(将它们存储在 Room 数据库 中)。我天真地尝试使用 Moshi,但是失败并出现以下错误:

无法获取可用的额外产品:com.example.MyQuery$MyFragmentInterface 接口没有 JsonAdapter

其中

MyFragmentInterface
在 Apollo 生成的用于处理查询片段的接口中。

因此,我尝试查找 Apollo 库是否有/生成任何转换方法,即像

toJson()
/
fromJson()
这样的转换方法,用于生成的模型,但是我找不到任何可用的东西。

我错过了一些明显的东西吗?

android graphql apollo moshi
3个回答
5
投票

自 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
}

2
投票

这是一个如何将字符串反序列化为生成对象的示例。内嵌评论以获取更多详细信息。

// 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

请记住,响应必须遵循架构。


0
投票

尝试

Postman
,看看错误是否也出现在那里https://blog.getpostman.com/2019/06/18/postman-v7-2-supports-graphql/

© www.soinside.com 2019 - 2024. All rights reserved.