代码之家  ›  专栏  ›  技术社区  ›  Dittimon

如何使用Kotlin在Android上的Apollo Graphql中创建JSON自定义类型适配器

  •  1
  • Dittimon  · 技术社区  · 6 年前

    我正在努力想办法在apolloclient中添加一个自定义类型适配器。

    对于一个突变,我们的服务器需要JSON输入。相应的iOS应用程序正在传入一个JSON字符串。

    当我传入字符串时,会收到一条消息,询问我是否忘记添加customtype。

    这是我的尝试:

    平地

    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之后,它就不编译了。

    如有任何提示或指示,我们将不胜感激。谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dittimon    6 年前

    apollo {
            useSemanticNaming = true
            customTypeMapping['ISOTime'] = "java.util.Date"
            customTypeMapping['Json'] = "java.lang.String"
        }
    
    推荐文章