如何在Swift中插入JSON数组模型?

时间:2017-06-16 15:35:47

标签: json swift

我有这样的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时,我会在控制台上看到它。

2 个答案:

答案 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