Swift:将JSON从URL转换为多个字符串

时间:2015-06-03 08:31:06

标签: json swift http parsing url

我正处于摇摆的困难部分,经过几个小时或调查后,我发现了信息,但还不足以完成我所寻求的目标。 我正在向服务器发送一个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-jsonhttp://owensd.io/2014/08/06/functional-json.htmlhttps://github.com/thoughtbot/Argohttp://roadfiresoftware.com/2014/08/a-safer-approach-to-json-parsing-in-swift/,但......

我是swift编码的新手,这是我使用这种语言的第一个月,我可能很想知道这个Json解析的事情......

感谢您的帮助。

3 个答案:

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