Apollo graphQL:在 iOS swift 中使用自定义标量时解码数组时出错

Posted

技术标签:

【中文标题】Apollo graphQL:在 iOS swift 中使用自定义标量时解码数组时出错【英文标题】:Apollo graphQL: Error decoding Array while using custom scalars in iOS swift 【发布时间】:2021-02-28 09:27:12 【问题描述】:

我有如下所示的架构。这里 question_r 是作为 Json 接收的字典数组。我面临转换它的问题。有什么办法可以成功解码吗?

"questionR": [
                              
                                "identifier": "123",
                                "skills": 
                                  "primary_skill": "vocabulary",
                                  "secondary_skill": "reading",
                                
                              
                            ]

这是架构


            "name": "question_r",
            "description": "",
            "args": [],
            "type": 
              "kind": "SCALAR",
              "name": "Json",
              "ofType": null
            ,
            "isDeprecated": false,
            "deprecationReason": null
          

我的脚本如下所示:

SCRIPT_PATH="$PODS_ROOT/Apollo/scripts" cd "$SRCROOT/$TARGET_NAME" "$SCRIPT_PATH"/run-bundled-codegen.sh codegen:generate --target=swift --includes=./**/*.graphql --passthroughCustomScalars --localSchemaFile="schema.json" API.swift

这是我定义 Json 的类型别名。它可以是字典或字典数组

public typealias Json = [String:Any?]

extension Dictionary: JSONDecodable 
    public init(jsonValue value: JSONValue) throws 
        guard let dictionary = value as? Dictionary else 
            throw JSONDecodingError.couldNotConvert(value: value, to: Dictionary.self)
        
        self = dictionary
    


extension Array: JSONDecodable
    public init(jsonValue value: JSONValue) throws 
        guard let array = value as? Array else throw JSONDecodingError.couldNotConvert(value: value, to: Array.self)
        self = array
    


有什么解决方法吗?我在这里错过了什么吗?

【问题讨论】:

无效的 json,缺少外部对象括号 @xadm 那不是问题。无论如何在这里编辑了回复 【参考方案1】:

我通过假设 Json 是一个数组并将字典转换为数组来实现它。

public typealias Json = [[String:Any?]]

extension Json: JSONDecodable
 
    public init(jsonValue value: JSONValue) throws
        guard let array = value as? Array else 
            guard let dict = value as? Dictionary<String, Any> else  throw JSONDecodingError.couldNotConvert(value: value, to: Dictionary<String, Any>.self)
            
            self = .init(arrayLiteral: dict)
            return
        
        self = array
    

这对我有用。

【讨论】:

以上是关于Apollo graphQL:在 iOS swift 中使用自定义标量时解码数组时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 GraphQL Apollo Client iOS 中模拟 JSON 数据解析

Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API

Graphql实践使用 Apollo(iOS) 访问 Github 的 Graphql API

如何在较旧的IOS /旧浏览器上使用Graphql Vue Apollo?

Apollo GraphQL iOS - 尝试在查询中使用“ID”时出现“未找到生成的操作”错误

Apollo GraphQL 标头在 iOS Swift 中总是失败