如何使用 Kotlin 在 Android 上的 Apollo GraphQL 中创建 JSON CustomTypeAdapter
How to create a JSON CustomTypeAdapter in Apollo GraphQL on Android with Kotlin
我正在努力弄清楚如何将 CustomTypeAdapter 添加到我的 ApolloClient。
对于突变,我们的服务器需要 json 输入。相应的 iOS 应用正在传递一个 json 字符串。
当我传入一个字符串时,我收到一条消息,询问我是否忘记添加自定义类型。
这是我的尝试:
build.gradle
apollo {
useSemanticNaming = true
customTypeMapping['ISOTime'] = "java.util.Date"
customTypeMapping['JSON'] = "java.lang.JSONObject"
}
这是实例化的地方。
val jsonCustomTypeAdapter = object : CustomTypeAdapter<JSONObject> {
override fun decode(value: CustomTypeValue<*>): JSONObject {
return JSONObject()
}
override fun encode(value: JSONObject): CustomTypeValue<*> {
return CustomTypeValue.GraphQLJsonString(value.toString())
}
}
mApolloClient = ApolloClient
.builder()
.serverUrl(baseUrl)
.addCustomTypeAdapter(jsonCustomTypeAdapter)
.normalizedCache(cacheFactory, CacheKeyResolver.DEFAULT)
.httpCache(ApolloHttpCache(cacheStore, null))
.okHttpClient(mHttpClient)
.build()
Apollo 似乎生成了一个实现 ScalarType 的 CustomType 枚举,但我不确定是否或如何使用它。
@Generated("Apollo GraphQL")
public enum CustomType implements ScalarType {
JSON {
@Override
public String typeName() {
return "Json";
}
@Override
public Class javaType() {
return Object.class;
}
},
ID {
@Override
public String typeName() {
return "ID";
}
@Override
public Class javaType() {
return String.class;
}
}
}
我尝试了 apolloandroid github 上给出的示例,但它对我不起作用,它在 Java 中,在我将其转换为 Kotlin 后,它无法编译。
如有任何提示或指导,我们将不胜感激。谢谢。
事实证明,Apollo 已经自动生成了类型,而我所要做的就是在 build.gradle 中正确声明它。我不需要向 ApolloClient 添加任何自定义类型适配器。
注意:类型 Json 是由我们的服务器提供的。
apollo {
useSemanticNaming = true
customTypeMapping['ISOTime'] = "java.util.Date"
customTypeMapping['Json'] = "java.lang.String"
}
我正在努力弄清楚如何将 CustomTypeAdapter 添加到我的 ApolloClient。
对于突变,我们的服务器需要 json 输入。相应的 iOS 应用正在传递一个 json 字符串。
当我传入一个字符串时,我收到一条消息,询问我是否忘记添加自定义类型。
这是我的尝试:
build.gradle
apollo {
useSemanticNaming = true
customTypeMapping['ISOTime'] = "java.util.Date"
customTypeMapping['JSON'] = "java.lang.JSONObject"
}
这是实例化的地方。
val jsonCustomTypeAdapter = object : CustomTypeAdapter<JSONObject> {
override fun decode(value: CustomTypeValue<*>): JSONObject {
return JSONObject()
}
override fun encode(value: JSONObject): CustomTypeValue<*> {
return CustomTypeValue.GraphQLJsonString(value.toString())
}
}
mApolloClient = ApolloClient
.builder()
.serverUrl(baseUrl)
.addCustomTypeAdapter(jsonCustomTypeAdapter)
.normalizedCache(cacheFactory, CacheKeyResolver.DEFAULT)
.httpCache(ApolloHttpCache(cacheStore, null))
.okHttpClient(mHttpClient)
.build()
Apollo 似乎生成了一个实现 ScalarType 的 CustomType 枚举,但我不确定是否或如何使用它。
@Generated("Apollo GraphQL")
public enum CustomType implements ScalarType {
JSON {
@Override
public String typeName() {
return "Json";
}
@Override
public Class javaType() {
return Object.class;
}
},
ID {
@Override
public String typeName() {
return "ID";
}
@Override
public Class javaType() {
return String.class;
}
}
}
我尝试了 apolloandroid github 上给出的示例,但它对我不起作用,它在 Java 中,在我将其转换为 Kotlin 后,它无法编译。
如有任何提示或指导,我们将不胜感激。谢谢。
事实证明,Apollo 已经自动生成了类型,而我所要做的就是在 build.gradle 中正确声明它。我不需要向 ApolloClient 添加任何自定义类型适配器。
注意:类型 Json 是由我们的服务器提供的。
apollo {
useSemanticNaming = true
customTypeMapping['ISOTime'] = "java.util.Date"
customTypeMapping['Json'] = "java.lang.String"
}