【问题标题】:Swift3 not playing nicely with my JSON fileSwift3 不能很好地处理我的 JSON 文件
【发布时间】:2017-07-07 14:06:39
【问题描述】:

我有以下代码:

let urlString = "https://str8red.com/jsonoverallleaderboard/"

let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
    if error != nil {
        print("there was an error")
        print(error)
    } 
    do {  
        let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String:Any]
    } catch let error as NSError {
        print(error)
    }
}        
}.resume()

在“let parsedData”行返回以下错误:

Could not cast value of type '__NSArrayI'

iIam 使用的 JSON 来自网站 https://str8red.com/jsonoverallleaderboard/,格式如下:

[["shanu", "1056"], ["snookro", "828"], ["tingeypa", "709"], ["shaun", "620"], ["chrakers", "506"]]

如果它有助于最终游戏是使用 JSON 并将其映射如下:

players = jsonPlayers.map { Player(name: $0[0], score: $0[1]) }

感谢任何帮助。

【问题讨论】:

  • 这是一个数组,不是字典。字符串数组的数组。 [[String]]。或者 [[Any]] 如果你不确定它们都是字符串。
  • 谢谢 Eric,我怎样才能在我的 swift 代码中纠正这个问题以使其合规?
  • 或者我根本不需要转换成 JSON 直接使用它?
  • as! [String:Any] 替换为as! [[String]]。 (我必须去afk。如果你迷路了,其他人会很乐意提供帮助)。
  • 谢谢 Eric :) 如果我卡住了,没有人帮忙,也许你以后可以成为我的英雄,哈哈

标签: json xcode swift3


【解决方案1】:

您的 JSON 数据不是[String:Any] 类型。而是[[String]]

所以以下将完成这项工作:

let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[String]]

但这是解析 JSON 数据的一种便捷方法。

enum JSONError: String, Error {
    case NoData = "ERROR: no data"
    case ConversionFailed = "ERROR: conversion from JSON failed"
}

typealias myJSONObjectType = [[String]]  // change this according to your data type that is in your JSON

func parseJSON(fromPath jsonURLString:String) {
    guard let jsonURL = URL(string: jsonURLString) else {
        print("Error creating an URL from \(jsonURLString)")
        return
    }
    URLSession.shared.dataTask(with: jsonURL) { (data, response, error) in
        do {
            guard let data = data else {
                throw JSONError.NoData
            }
            guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? myJSONObjectType else {
                throw JSONError.ConversionFailed
            }
            print(json)
        } catch let error as JSONError {
            print(error.rawValue)
        } catch let error as NSError {
            print(error.debugDescription)
        }
        }.resume()
}

并像这样使用它:

object.parseJSON(fromPath: "https://str8red.com/jsonoverallleaderboard/")

【讨论】:

  • 是字符串部分让它工作。没有尝试其他部分,但感谢帮助:)
猜你喜欢
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 2017-03-29
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多