【问题标题】:Problem converting JSON to Array with Swift使用 Swift 将 JSON 转换为数组的问题
【发布时间】:2020-12-09 20:14:27
【问题描述】:

我尝试将 JSON 转换为数组,但遇到了一些问题,不知道如何解决。 我使用 Swift 5 和 Xcode 12.2。

这是我的 PHP 查询中的 JSON:

    [
            {
            Crewcode = AAA;
            Phone = 5553216789;
            Firstname = Philip;
            Lastname = MILLER;
            email = "pmiller@xxx.com";
        },
            {
            Crewcode = BBB;
            Phone = 5557861243;
            Firstname = Andrew;
            Lastname = DEAN;
            email = "adean@xxx.com";
        }
    ]

这是我的 Swift 代码:

    let url: URL = URL(string: "https://xxx.php")!

    let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)

    let task = defaultSession.dataTask(with: url) { (data, response, error) in

        if error != nil {
            print("Failed to download data")
        }
        else {
            print("Data downloaded")

            do {
                if let jsondata = (try? JSONSerialization.jsonObject(with: data!, options: [])) {
                    
                    print(jsondata)

                    struct Crew: Decodable {
                        var Code: String
                        var Phone: String
                        var Firstname: String
                        var Lastname: String
                        var email: String
                    }

                    let decoder = JSONDecoder()
                    do {
                        let people = try decoder.decode([Crew].self, from: jsondata as! Data)
                        print(people)
                    }
                    catch {
                        print(error)
                    }
                }
            }
        }
    }
    
    task.resume()

当我运行我的代码时,我收到以下错误:

无法将“__NSArrayI”(0x7fff86b930b0) 类型的值转换为“NSData”(0x7fff86b911e8)。 2020-12-09 14:52:48.988468+0100 FTL[57659:3019805] 无法将“__NSArrayI”(0x7fff86b930b0)类型的值转换为“NSData”(0x7fff86b911e8)。 无法将“__NSArrayI”(0x7fff86b930b0)类型的值转换为“NSData”(0x7fff86b911e8)。

如果你有任何想法来做对,我提前感谢你在这方面的帮助!

【问题讨论】:

  • 您将 JSONSerialization 与 JSONDecoder 混合使用。这些是不相关的(前者是一个长期存在的 ObjC 系统;后者是一个较新的 Swift 系统)。 JSONDecoder 期望您将实际数据传递给它。删除 JSONSerialization 代码。但请注意,您的结构要求您的 JSON 不包含 Code 参数。如果它是可选的,那么您需要将其设为可选 (String?)。
  • 非常感谢您的帮助!

标签: arrays json swift


【解决方案1】:

您通过混合 JSONSerializationJSONDecoder 将 JSON 反序列化两次。

删除第一个

 if let jsondata = (try? JSONSerialization.jsonObject(with: data!, options: [])) {
罢工>

– 顺便说一下,问题中的 JSON 既不是鱼也不是禽兽,既不是 JSON,也不是 NS.. 集合类型转储 –

替换

let people = try decoder.decode([Crew].self, from: jsondata as! Data)

let people = try decoder.decode([Crew].self, from: data!)

并且结构成员名称必须与键匹配,否则您必须添加 CodingKeys

【讨论】:

  • 非常感谢您的帮助!我试过了,效果很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多