【问题标题】:Trying to parse json for public git repos in swift but receiving "Expected to decode Dictionary<String, Any> but found an array instead."试图在 swift 中解析公共 git repos 的 json,但收到“预期解码 Dictionary<String, Any> 但找到了一个数组”。
【发布时间】:2020-01-18 12:40:22
【问题描述】:

我的 json 看起来像这样:

[
{
    "name": "sensei",
    "owner": {
        "login": "linkedin",
    },
    "description": "distributed realtime searchable database",
    "fork": false,
},
{
    "name": "linkedin-utils",
    "owner": {
        "login": "linkedin",
    },
    "description": "Base utilities shared by all linkedin open source projects",
    "fork": false,
}
]

我构建的结构如下:

    struct LinkedinData: Codable {
    var name: String
    var description: String
        var owner: OwnerLogin
        var fork: Bool
    }



  struct OwnerLogin: Codable {
        var login: String
    }

我的解析代码是这样的:

    import UIKit

class ViewController: UIViewController {

    var linkedinData = [LinkedinData]()


    override func viewDidLoad() {
        super.viewDidLoad()

        let urString : String = "https://api.github.com/orgs/linkedin/repos"

                if let url = URL(string: urString) {
                    let session = URLSession(configuration: .default)
                    let task = session.dataTask(with: url) { (data, response, error) in
                        if error != nil {
                            print(error!)
                            return //exit out of function
                        }
                        parseJSON(json: data!)

                    }
                    task.resume()
                }

            func parseJSON(json: Data) {
                let decoder = JSONDecoder()
                if let decodedData = try? decoder.decode(LinkedinData.self, from: json) {
                    linkedinData = [decodedData]

                }
            }

        }

我尝试了几个小时,但似乎无法解析 json 并在集合类型中检索我正在寻找的数据(名称、描述、owner.login 和 fork)。你能帮忙吗?

【问题讨论】:

    标签: json swift git parsing


    【解决方案1】:

    您应该解码LinkedinData 的数组,而不仅仅是一个,因为您的 JSON 有一个数组作为其根:

    [ <------- this "[" indicates an array
    {
        "name": "sensei",
        "owner": {
            "login": "linkedin",
        },
    

    因此,你应该写:

    if let decodedData = try? decoder.decode([LinkedinData].self, from: json) {
        linkedinData = decodedData
    
    }
    

    【讨论】:

    • 谢谢!我相应地进行了更改,现在它正在工作。但是,我的变量 linkedinData 似乎没有在函数之外更新其数组的值。我能做什么?
    • 您可能会在获取它之前检查它的值。请记住,在线获取东西需要时间。它将在完成处理程序中更新值(在data, response, error) in 位之后),因此您应该执行所有需要该值的操作。 @ALeknud
    【解决方案2】:
    if let decodedData = try? decoder.decode(LinkedinData.self, from: json) {
         linkedinData = [decodedData]
    }
    

    将其替换为

     if let decodedData = try? decoder.decode([LinkedinData].self, from: json) {
         linkedinData = decodedData
     }
    

    因为您在 JSON 中最顶层的对象是一个数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-09
      • 1970-01-01
      • 2021-09-23
      相关资源
      最近更新 更多