json序列化和获取值存在问题
我有JSON格式的数据,我想从如下结构中获取数据-我想获取时间值,在本例中是字符串:“04:35:00”,并将所有这些时间值附加到我的小时模型中json序列化和获取值存在问题,json,swift,serialization,Json,Swift,Serialization,我有JSON格式的数据,我想从如下结构中获取数据-我想获取时间值,在本例中是字符串:“04:35:00”,并将所有这些时间值附加到我的小时模型中 { "result": [ { "values": [ { "value":"null", "key":"symbol_2" }, { "value":"nul
{
"result": [
{
"values": [
{
"value":"null",
"key":"symbol_2"
},
{
"value":"null",
"key":"symbol_1"},
{
"value":"016",
"key":"company"
},
{
"value":"QUW12DO",
"key":"direction"
},
{
"value":"TD-4WYS",
"key":"road"
},
{
"value":"04:35:00",
"key":"time"
}]},
//通过这样的代码:
URLSession.shared.dataTask(with: (url as URL?)!, completionHandler: {(data, response, error) -> Void in
if let jsonObj = try? JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSDictionary {
print(jsonObj!.value(forKey: "result")!)
if let stopsArray = jsonObj!.value(forKey: "result") as? NSArray {
for stop in stopsArray{
if let stopDict = stop as? NSDictionary {
let hours = stopDict.value(forKey: "time")
let myModel = Hours(hours: hours as? String)
self.list.append(myModel)
print("LIST: \(self.list)")
DispatchQueue.main.async {
self.actInd.stopAnimating()
self.actInd.isHidden = true
self.containerLittle.isHidden = true
self.loadingView.isHidden = true
}
}
}
}
}
}).resume()
在这一刻,当我将代码附加到模型中时,到处都是nill。如何获取模型的时间值?JSON的结构更加复杂。JSON是包含字典数组的字典数组。请尝试以下代码:
typealias JSONDict = Dictionary<String, Any>
typealias JSONArray = Array<Any>
if let result = jsonObj?["result"] as? JSONArray {
for case let value as JSONDict in result {
if let values = value["values"] as? JSONArray {
for case let value as [String : String] in values {
if let timeString = value["value"], value["key"] == "time" {
// Create your Hours model
print(timeString)
// Use break only if you have single "time" member in "values" array
//break
}
}
// Use break only if you have single "values" member in "result" array
//break
}
}
}
typealias JSONDict=字典
typealias JSONArray=数组
如果let result=jsonObj?[“result”]as?杰索纳雷{
对于case let,结果中的值为JSONDict{
如果let values=value[“values”]as?JSONArray{
对于大小写,让值作为值中的[String:String]{
如果let timeString=value[“value”],value[“key”]=“time”{
//创建您的工时模型
打印(时间字符串)
//仅当“值”数组中有一个“时间”成员时才使用break
//中断
}
}
//仅当“结果”数组中有一个“值”成员时才使用break
//中断
}
}
}
First-不要在Swift中使用NSDictionary
或NSArray
。使用合适的Swift字典和数组。首先解决这个问题,事情就会简单得多。你的回答中没有时间键。是的,伙计们,你让我开心了!我只删除了break
,myModel包含了我需要的所有内容。谢谢@Moritz关于value(forKey:)方法,您是对的。这只是我这边的一个打字错误。我已经用object(forKey:)方法替换了它,谢谢。您还看到了哪些错误?这段代码在操场上运行良好,并提供了正确的结果。@Moritz我做了一些重构,现在看起来更像Swift way。