如何使用 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"
    }