SWIFT3 JSON NSNull Issue



我有以下swift3代码。 JSON 可以为 $0[2] 值返回 NSNull 值。

struct Player3 {
let name : String
var score : String
let avatar : String
}
class HistoricLeagueVC: UITableViewController {
var players = [Player3]()
override func viewDidLoad() {
super.viewDidLoad()

let urlString = "https://str8red.com/jsonoverallleaderboard/1025/"
let url = URL(string: urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
if error != nil {
print("there was an error")
} else {
do {
let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[String]]
self.players = parsedData.map { Player3(name: $0[0], score: $0[1], avatar: $0[2]) }
print(self.players.count)
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let error as NSError {
print(error)
}
}
}.resume()
}

我试图将其转换为空字符串但没有成功。 我还尝试设置一个默认字符串,例如"https://str8red.com/static/no_profile_picture.png"理想情况下,这就是我想做的。

终端状态中的错误Could not cast value of type 'NSNull' (0xed1c78) to 'NSString' (0x57b6b8).

任何帮助将不胜感激。

不要投射到[[String]]

let parsedData = try JSONSerialization.jsonObject(with: data!) as! [[Any]]
self.players = parsedData.map { Player3(
name: ($0[0] as? String) ?? "",
score: ($0[1] as? String) ?? "",
avatar: $0[2] as? String, // keeping `nil` here
)}

您可能甚至应该as! [[Any]]以更安全的方式(使用as?(,但上述方法将起作用。

如果您的输入数据出现任何问题,您的代码将严重崩溃。问问你的老板他或她是否同意。我不会。以下是崩溃的方式:如果数据 == nil(但如果错误 == nil,则不应该(。您遇到了一个问题,即数据无法在不崩溃的情况下解析。如果数据未解析为数组,则崩溃;如果数组的元素不是所有数组,则崩溃;如果内部数组中的元素不都是字符串;如果任何内部数组包含两个或更少的字符串,则崩溃。我想说这是非常不可接受的。

我的策略是:如果响应无法解析或不是数组数组,则忽略它,保持 self.player 不变。如果存在数组数组,请重置 self.players,然后为每个包含至少三个项目的数组添加一个播放器,其中前两个必须是字符串。

guard data != nil else { return }
guard let parsed = try? NSJSONSerialization(with: data!) else { return }
guard let arrays = parsed as? [[Any]] else { return }
self.players.removeAll()
for array in arrays {
guard array.count >= 3,
let name = array [0] as? String, 
let score = array [1] as? String else { continue }
let avatar = array [2] as? String ?? ""
self.players.append(Player3 (name: name, score: score, avatar: avatar))
}

将类似内容移动到单独的方法中是个好主意。添加您认为合适的任何错误处理或日志记录。

最新更新