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

时间:2019-12-19 16:00:33

标签: android graphql android-room apollo moshi

我使用Apollo Android library向GraphQL端点进行查询。 一切正常,直到我尝试将查询结果存储到Room database

具体来说,我想将结果存储在数据库的表列中。对于复杂对象(例如由阿波罗生成的模型)执行此操作的推荐方法是使用@TypeConverter,将复杂对象与Room本身支持的类型之间进行转换。 String

所以我想将阿波罗生成的对象与GraphQL响应的相应JSON字符串相互转换。我天真地尝试使用Moshi,但是此操作失败并显示以下错误:

  

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

由Apollo生成的用于处理查询片段的界面中的MyFragmentInterface

然后,我尝试查找Apollo库是否具有/生成了这些转换方法,例如,对于生成的模型,诸如toJson() / fromJson()之类的转换方法,但是我找不到任何东西。

那么,有什么方法可以做我想要的吗?

2 个答案:

答案 0 :(得分:1)

从Apollo 1.3.x开始,Java中提供了一个Operation.Data.toJson()扩展函数(Kotlin)和一个相应的serialize静态方法。 选中https://www.apollographql.com/docs/android/advanced/no-runtime/#converting-querydata-back-to-json

与之相反,Query.Data的Json字符串,我使用类似以下的内容:

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
}

答案 1 :(得分:0)

尝试Postman并查看错误是否也出现在https://blog.getpostman.com/2019/06/18/postman-v7-2-supports-graphql/