前段时间我创建了一个函数来获取json并将其打印到终端。它工作得很好,但是两年前,当我把它复制到我的最新项目中时,它充满了错误:/我已经解决了大部分问题,但我仍有两个未解决的问题如下:
var arr = JSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSArray
以上一行抱怨电话中有“额外争论”错误。
for var i = 0 ; i < (arr as NSArray).count ; i += 1
上面一行说“在快速3中删除了C-Style for statement”
任何有关解决这两个问题的帮助都会很棒。
完整功能代码如下:
func jsonParsing()
{
let prefs:UserDefaults = UserDefaults.standard
var webaddress = prefs.value(forKey: "WEBADDRESS") as! String
let url2 = URL(string: webaddress + "straightred/jsonfixture/")
let data = try? Data(contentsOf: url2!)
var arr = JSONSerialization.JSONObjectWithData(data!, options: nil, error: nil) as! NSArray
arrDict = []
for var i = 0 ; i < (arr as NSArray).count ; i += 1
{
arrDict.addObject((arr as NSArray) .objectAtIndex(i))
}
print(arrDict);
}
答案 0 :(得分:2)
首先,不要在Swift中使用NSArray
,请使用Swift本机集合类型。
其次,不要从远程网址同步加载数据,请使用URLSession
第三,你不需要循环,只需将接收到的数组分配给arrDict
将arrDict
声明为Swift数组字典
var arrDict = [[String:Any]]()
此代码使用UserDefaults
和do - catch
块的正确方法,options
jsonObject(with
参数可以省略。
func jsonParsing()
{
let prefs = UserDefaults.standard
let webaddress = prefs.string(forKey: "WEBADDRESS")!
let url2 = URL(string: webaddress + "straightred/jsonfixture/")!
let task = URLSession.shared.dataTask(with: url2) { [unowned self] (data, response, error) in
if let error = error {
print(error)
return
}
do {
let arr = try JSONSerialization.jsonObject(with:data!) as! [[String:Any]]
self.arrDict = arr
print(self.arrDict)
} catch {
print(error)
}
}
task.resume()
}
答案 1 :(得分:1)
JSONSerialization
不再将错误引用作为参数,现在它会抛出异常
var arr : Array<AnyObject> = try JSONSerialization.jsonObject(with: data, options: nil)
至于循环,在Swift 3中完全删除了C风格的循环,所以使用
for object in arr {
// do stuff
}
或
for i in 0<..arr.count {
// do stuff
}
答案 2 :(得分:1)
对于第一个你需要添加的尝试catch
do {
var arr : Array<AnyObject> = JSONSerialization.jsonObject(with: data!)) as! NSArray
// do your works
} catch {
print("Got error: \(error)")
}
对于第二个,您需要以下列方式使用for循环
for i in 0..<arr.count {
//do your stuff here
}
答案 3 :(得分:0)
对于循环格式:
for i in 0..<arr.count {
...code here...
}
答案 4 :(得分:0)
Swift 3.1
用于JSON序列化尝试如下:
do {
var arr = try JSONSerialization.jsonObject(with: data, options: []) as! NSArray
} catch {
}
for Loop语法使用像这样
for i in 0..<arr.count {
// Do your stuff
}
答案 5 :(得分:0)
这是您在有效的Swift 3语法中的全部功能。
请注意JSONSerialization.jsonObject
现在可以投掷。你可以只使用for element in collection
语法,你不需要自己指定索引,并且已经从Swift 3中删除了C style for循环,如果你真的需要一个C风格的循环,你必须使用{ {1}}。
在Swift中不鼓励使用stride
,如果你真的想使用非显式类型,请使用NSArray
,但在可能的情况下使用显式类型。
另外,请确保正确处理可选的展开,并且在使用强制展开/强制转换时,不会出现运行时错误。
Array<Any>
答案 6 :(得分:0)
func jsonParsing()
{
let prefs:UserDefaults = UserDefaults.standard
var webaddress = prefs.value(forKey: "WEBADDRESS") as! String
let url2 = URL(string: webaddress + "straightred/jsonfixture/")
let data = try? Data(contentsOf: url2!)
var arr = try JSONSerialization.jsonObject(with: data!) as! [Any] // if Array of any type, if array of dictionaries cast it to [[String:Any]]
arrDict = []
for value in arr { // instead of iterating over your array you can simply copy it to arrDict. I added for loop for your refernce.
arrDict.addObject(name)
}
print(arrDict);
}
JSON序列化方法已更新。不推荐使用C样式for循环使用枚举来枚举整个数组。 我不支持在Swift类中使用Objective-C类。不要将阵列分为NSArray或NDDictionary。
答案 7 :(得分:0)
In Swift 3, try this code for son parsing
func jsonParsing()(){
//check if strUrl not nill then enter this block
if strUrl != nil{
var request = URLRequest(url: URL(string: strUrl!)!)//get requet from urlRequest
let session = URLSession.shared //creat session object
request.httpMethod = "GET" // set http method
//get data from url using session.datatask methos
session.dataTask(with: request) {data, response, error in
if error != nil{
print(error!.localizedDescription)
return
}
do{
//get json result and store in dictionary
let dicJsonResult = try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary
let arrData = dicJsonResult["data"] as! NSArray // set friend list in array
self.tblView.reloadData()
}
catch
{
print(error.localizedDescription)
}
}.resume()
}else{
print("No more friends")
}
}