我尝试使用SwiftyJSON解析JSON但我遇到了问题。
我使用here
中的教程这是我的代码
var JSONStorage : [Article?]?
var objects = [[String: String]]()
override func viewDidLoad() {
super.viewDidLoad()
let number = arc4random_uniform(1000)
let urlString = "http://78.27.190.58:3200/api/get_article/17?\(number)"
if let url = NSURL(string: urlString) {
if let data = try? NSData(contentsOfURL: url, options: []) {
let json = JSON(data: data)
for element in json["article"].arrayValue {
let id = Int(element["id"].stringValue)
let title = element["title"].stringValue
let subtitle = element["subtitle"].stringValue
let body = element["body"].stringValue
let img = element["images"]["main"].rawValue
let obj = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img]
objects.append(obj)
}
}
}
}
这是我得到的错误
我做错了什么?
答案 0 :(得分:2)
您的objects
类型为[[String:String]]
,是一组字典。这些词典的键入为String
,值为String
。
但是你向这个数组中添加了一个包含不同类型值的字典:String
s和.stringValue
个对象,以及.rawValue
一个必须是我认为的NSData类型。< / p>
解决方案可能是键入您的词典[String:AnyObject]
(以及您的数组[[String:AnyObject]]
)并在检索值时在另一侧进行类型转换。
顺便说一句,编译器说“表达式是模糊的”,因为它在推断数组的类型时失败了(现在我们知道为什么)。
请注意,解析JSON时效率不高。更好的方法是从数据中创建对象:类或结构。例如,您可以使用结构Article
来保存每个element
值,就像您在另一个问题中所示。
答案 1 :(得分:0)
swift中的数组或字典不能是异构的。如果查看代码,则需要将一个int和四个字符串作为obj的值。
这将有效:
for element in json["article"].arrayValue {
let id = element["id"].stringValue // must be string to put it in obj
let title = element["title"].stringValue
let subtitle = element["subtitle"].stringValue
let body = element["body"].stringValue
let img = element["images"]["main"].rawValue
let obj: [String: String] = ["id": id, "title": title, "subtitle": subtitle, "body": body, "img": img]
objects.append(obj)
}