【问题标题】:Unable to Cast JSON as Dictionary After Serialization序列化后无法将 JSON 转换为字典
【发布时间】:2019-12-17 17:13:13
【问题描述】:

我正在尝试将返回的 JSON 转换为字典以供使用,但由于某种原因,它无法正常工作。我也没有收到任何错误,这就是为什么我真的很难过。

此块将显示我的序列化和转换。我的第一个打印语句被命中,但第二个打印语句从未到达。

do {
    let jsonAny = try JSONSerialization.jsonObject(with: data, options: [])
    print("made it through serialization")
    guard let json = jsonAny as? [String: String] else { return } //also tried [String: Any]
    print("passed the guard let")
    let fish = self.parseFishManual(json: json)

    //print(fish.name)
    //print(fish.scientific)
} catch {
    debugPrint(error.localizedDescription)
    return
}

对此的任何帮助表示赞赏!

编辑: json可以通过以下链接查看(添加一个从1到24的数字以查看单个数据) https://thefishapi.herokuapp.com/api/fish/

这是整个 URL 会话函数:

func getFishSpeciesUrlSession() {

        guard let url = URL(string: URL_SPECIES) else { return }

        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard error == nil else {
                debugPrint(error.debugDescription)
                return
            }

            guard let data = data else { return }

            do {
                let jsonAny = try JSONSerialization.jsonObject(with: data, options: [])
                print("made it through serialization")
                guard let json = jsonAny as? [String: Any] else { return }
                print("passed the guard let")
                let fish = self.parseFishManual(json: json)

                print(fish.name)
                print(fish.scientific)

            } catch {
                debugPrint(error.localizedDescription)
                return
            }

            //print("Data = \(data)")
            //print("Response = \(response)")
        }

这是我的 parseFishManual 方法:

private func parseFishManual(json: [String: Any]) -> Fish {
        let name = json["name"] as? String ?? ""
        let scientific = json["scientific"] as? String ?? ""
        let environment = json["environment"] as? String ?? ""
        let biology = json["biology"] as? String ?? ""
        let description = json["description"] as? String ?? ""

        let fish = Fish(name: name, scientific: scientific, environment: environment, biology: biology, description: description)
        return fish
    }

【问题讨论】:

  • jsonAny 不是 [String:String]。显示您的实际 JSON。
  • 你应该转换成[String: Any],如果你的JSON的根是一个数组,甚至是[Any]
  • 所以我也使用了String: Any,但我最终得到了相同的结果。没有错误信息,也没有打印数据。有什么其他错误的想法吗?当我回到电脑前时,我会用更多代码更新我的问题。

标签: ios json swift parsing


【解决方案1】:

您的 JSON 实际上是一个字典数组。所以你应该转换为[[String: Any]]

do {
    guard let json = try JSONSerialization.jsonObject(with: data, options: [.mutableContainers]) as? [[String: Any]] else {
        return
    }

    print(json)
} catch {
    print(error)
}

顺便说一句,您的 JSON 不正确。如果我尝试从 URL 解码 JSON,我会得到:

错误域=NSCocoaErrorDomain 代码=3840 “字符 25701 周围的对象格式错误。” UserInfo={NSDebugDescription=字符 25701 周围的对象格式错误。}

如果您在 JSON 中查找单词 \"swarm\" 并将其替换为 \\"swarm\\" 并将其转换为 [[String: Any]],它将正确序列化您的 JSON。但是,我不知道您是否期望我提议的那个词。

【讨论】:

  • 如果我改变我的守卫让你的显示,我得到这个错误:Cannot convert value of type '[[String : Any]]' to expected argument type '[String : Any]' 另外,至于我的 json,你是说我需要在词群中添加另一个 \ 吗?这是一个用于描述其中一种鱼类的词。我将整个会话方法以及我的解析方法添加到问题中。
  • 是的,您应该再添加一个斜线。因为它无法正确逃脱。此外,您需要更改方法中的参数。因为您正在传递一个字典数组,而您的方法需要一个字典。像这样看,你需要传递一个字典列表,而你的方法需要一个字典。
【解决方案2】:

您的api返回的json不是[String:Any]的形式,而是一个数组[[String:Any]],即一个字典数组

这是你可以做的。

do {
        let jsonAny = try JSONSerialization.jsonObject(with: data, options: [])
        print("made it through serialization")
        guard let jsonArray = jsonAny as? [[String: Any]] else { return }
        print("passed the guard let")
        //Create your fishObject's array like this.
        let fishArray = jsonArray.compactMap({ (jsonDict) -> YourFishClass in
        //Parse your json dict array to get jsonDict
        //Return Fish object here
            return self.parseFishManual(json: jsonDict)
        })

    } catch {
        debugPrint(error.localizedDescription)
        return
    }

【讨论】:

    猜你喜欢
    • 2018-09-21
    • 2019-02-08
    • 2017-05-26
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2017-10-19
    • 2017-07-27
    • 2014-02-26
    相关资源
    最近更新 更多