我有这样的JSON但有更多数据:
[
{
"name": "Place 1",
"avatar": "https://sometext.it/image=1",
"id": "1",
"lng": 10.01,
"lat": 15.02
},
{
"name": "Place 2",
"avatar": "https://sometext.it/image=2",
"id": "2",
"lng": 15.02,
"lat": 15.03
}
]
我从URL获取JSON,我想将它们插入到数组的位置。我上课了:
class Place {
var Avatar = ""
var Id = 0
var Lat = 0.0
var Lng = 0.0
var Name = ""
required init(avatar: String, id: Int, lat: Double, lng: Double, name: String) {
self.Avatar = avatar
self.Id = id
self.Lat = lat
self.Lng = lng
self.Name = name
}
}
我创建了一个数组:
var places: [Place] = []
我像这样序列化JSON:
func parsingJson() {
guard let url = URL(string: "https://somelink.com") else {
return
}
let session = URLSession.shared
session.dataTask(with: url) { (data, response, error) in
if let response = response {
print(response)
}
if let data = data {
print(data)
do {
let json = try JSONSerialization.jsonObject(with: data, options: [])
for result in json as! [[String:Any]] {
let avatar = result["avatar"] as! String
let id = result["id"] as! Int
let lat = result["lat"] as! Double
let lng = result["lng"] as! Double
let name = result["name"] as! String
let place = Place(avatar: avatar, id: id, lat: lat, lng: lng, name: name)
self.places.append(place)
print(result)
}
}catch {
print("JSON Error")
}
}
}.resume()
}
但这不起作用,我有这样的错误:http://obrazki.elektroda.pl/9267167800_1497627255.png
我知道我没有,但我不知道为什么:(当我在序列化时打印JSON时,我会在控制台上看到它。
答案 0 :(得分:0)
你还没有,读错误 - 无法将NSTaggedPointerString类型的值转换为NSNumber这意味着你的id是String并且你将它转换为Int所以替换
let id = result["id"] as! Int
到
let id = result["id"] as! String
答案 1 :(得分:0)
首先,当你的JSON对象显示它是一个字符串时,你试图将ID作为INT。所以你需要这样做:
var id = Int()
if let someID = result["id"] as? String {
id = Int(someId)
} else {
print("ID failed as String")
}
但是,我还建议在你的for循环之前使用一个guard语句:
guard let json = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:Any]] else {
print("Invalid json object type")
return
}
for result in json {
///your code.
}
你至少尝试打开变量,并获取一些Int实例传递
但很明显,更简单的解决方案是将JSON中的id字段保存到前端所需的类型..在本例中为数字。
虽然它可能看起来不像你的代码一样干净,但是尽可能使用诸如警卫和if-else逻辑之类的解包方法,并尽可能早地在项目中创建失败的展开回退。当项目变得足够大时,它有助于调试线路并创建良好的基础。 查看Apple的guide,此处查看some good starting points。
延迟更新,但重新阅读所有这些让我对Apple的这篇简洁文章感到满意: https://developer.apple.com/swift/blog/?id=37