我正处于摇摆的困难部分,经过几个小时或调查后,我发现了信息,但还不足以完成我所寻求的目标。 我正在向服务器发送一个POST http请求,这个请求将一个JSON转换为NSDictionnary:
let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &err) as? NSDictionary
要查看服务器发送给我的内容,我打印此NSString:
let responseString = NSString(data: data, encoding: NSUTF8StringEncoding)
println("**** response data = \(responseString)")
这是它可以归还给我的一个例子:
**** response data = Optional({"result":true,"data":"[{\"id\":\"284ad166f8152268e4010c4cb21c40c13f195165\",\"due\":null,\"description\":\"\",\"status\":\"LATE\",\"summary\":\"tache late\",\"context\":\"\",\"folder\":\"INBOX\"},{\"id\":\"b43bd766295220b23279899d025217d18e98374a\",\"due\":null,\"description\":\"\",\"status\":\"IN-PROCESS\",\"summary\":\"tache in process\",\"context\":\"\",\"folder\":\"INBOX\"}]"}
我想要的是将这些信息分开以获取字符串上的Id,将另一个信息写入另一个,等等,将它们打印在UITableView上,每个数组一行。
我找到了大量的教程,链接,例如https://github.com/dankogai/swift-json,http://owensd.io/2014/08/06/functional-json.html,https://github.com/thoughtbot/Argo或http://roadfiresoftware.com/2014/08/a-safer-approach-to-json-parsing-in-swift/,但......
我是swift编码的新手,这是我使用这种语言的第一个月,我可能很想知道这个Json解析的事情......
感谢您的帮助。
答案 0 :(得分:1)
如果您实际上将其作为NSDictionary取回,则不需要将其转换为其他任何内容。
{{1}}
答案 1 :(得分:1)
您可以使用SwiftyJson或手动执行此操作。你得到了json,所以你不需要将它转换为NSString。 首先使用
打开字典json!
其次你需要得到你想要的东西。如您所见,您需要从“data”键获取值,因此使用
获取值json!["data"]
接下来,您可以访问任何您想要的内容
if let id = json!["data"]!["id"]! {
println(id)
}
if let due = json!["data"]!["due"]! {
println(due)
}
if let description = json!["data"]!["description"]! {
println(description)
}
现在您可以在UITableViewCell中表示它。例如,您可以使用id
作为标题,due
& description
作为内容。
这里唯一重要的是了解如何访问字典中的键和值。
为了不再重复自己,更好的方法是将data
的值存储到常量
let data = json!["data"]!
然后从中获取您喜欢的东西。作为实例
if let id = data["id"]! {
println(id)
}
这是一个向您展示如何操作的小例子
let dict = Optional(["data": ["id": "12345", "due": "due date", "description": "some description"]])
let data = dict!["data"]!
println(data["id"]!)
// 12345
println(data["due"]!)
// due date
println(data["description"]!)
// some description
修改:为问题添加解决方案。问题在于JSON结果的投射方式。而不是? NSDictionary用作? [AnyObject]
let serverJsonResponse = "[{\"id\":\"284ad166f8152268e4010c4cb21c40c13f195165\",\"due\":null,\"description\":\"\",\"status\":\"LATE\",\"summary\":\"tache late\",\"context\":\"\",\"folder\":\"INBOX\"},{\"id\":\"b43bd766295220b23279899d025217d18e98374a\",\"due\":null,\"description\":\"\",\"status\":\"IN-PROCESS\",\"summary\":\"tache in process\",\"context\":\"\",\"folder\":\"INBOX\"}]"
var error: NSError?
let json/*: [AnyObject]*/ = NSJSONSerialization.JSONObjectWithData(serverJsonResponse.dataUsingEncoding(NSUTF8StringEncoding)!, options: NSJSONReadingOptions.MutableContainers, error: &error) as [AnyObject]
// println(json)
// Before casting to [AnyObject]
// println(json as? [AnyObject])
// dump(json)
for dict in json {
// dump(dict)
println(dict["id"])
println(dict["due"])
println(dict["description"])
// if let id = dict["id"] as? Int {
// println(id)
// }
// if let due = dict["due"] as? String {
// println(due)
// }
// if let description = dict["description"] {
// println(description)
// }
}
答案 2 :(得分:1)
响应中的JSON data
字段是一个字典数组([
是JSON数组的起始分隔符,{
是JSON字典的起始分隔符。)< / p>
[{\ “ID \”:\ “284ad166f8152268e4010c4cb21c40c13f195165 \” \ “由于\”:空,\ “DESCRIPT离子\”:\ “\” \ “状态\”:\ “LATE \”, \“summary \”:\“tache late \”,\“context \”:\“\”,\“folder \”:\“INBOX \”},{\“id \”:...
因此,一旦您使用现有行解码了全局JSON响应:
let json = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &err) as? NSDictionary
你只需要像@ iosDev82解释的那样抓住这部分响应,但你必须把它作为一个字典数组而不是一个简单的字典:
if let responseArray = json!.objectForKey("data") as? [[String:AnyObject]] {
for dic in responseArray {
let theID = dic["id"] as? String
let theStatus = dic["status"] as? String
// etc
}
}
修改强>
嗯,我知道你的数据让我想起了什么......看看这个:https://stackoverflow.com/a/30570819/2227743我已经向你解释了这个问题。 :)您必须首先将data
字段视为字符串,然后解码其包含的JSON,然后访问其对象。
解码JSON响应&gt;获取“数据”字段为String&gt;解码此 JSON字符串&gt;访问对象
示例:
let dataFieldDecodedFromJSONAsString = "[{\"id\":\"284ad166f8152268e4010c4cb21c40c13f195165\",\"due\":null,\"description\":\"\",\"status\":\"LATE\",\"summary\":\"tache late\",\"context\":\"\",\"folder\":\"INBOX\"},{\"id\":\"b43bd766295220b23279899d025217d18e98374a\",\"due\":null,\"description\":\"\",\"status\":\"IN-PROCESS\",\"summary\":\"tache in process\",\"context\":\"\",\"folder\":\"INBOX\"}]"
let insideJSONStringReEncodedAsData = dataFieldDecodedFromJSONAsString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
if let json2 = NSJSONSerialization.JSONObjectWithData(insideJSONStringReEncodedAsData!, options: nil, error: nil) {
if let responseArray = json2 as? [[String:AnyObject]] {
for dic in responseArray {
let theID = dic["id"] as? String
let theStatus = dic["status"] as? String
// etc
}
}
}