【问题标题】:How to parse JSON in Swift 2.1?如何在 Swift 2.1 中解析 JSON?
【发布时间】:2016-01-14 09:29:18
【问题描述】:

我需要像这样解析一个 JSON 字符串

{
    "someData": [{
        "title": "Test!",
        "content": "hello!"
    }, {
        "title": "Test 2!",
        "content": "hello!"
    }],
    "otherData": [{
        "title": "Hey",
        "content": "yes or no"
    }]
}

我有一些代码可以解析 json。但是这段代码只是解析只在一个数组中的 json。我已经玩过代码,所以我可以解析一个数组,该数组位于一个包含文本的数组中(我的意思是顶部的这个 json)。

现在我放弃了……我必须做些什么才能让它起作用?

let jsonString = NSString(data: getJSON("URL"), encoding: NSUTF8StringEncoding)
    let jsonData = jsonString!.dataUsingEncoding(NSUTF8StringEncoding)!
    do {
        if let parsed = (try NSJSONSerialization.JSONObjectWithData(jsonData, options:  NSJSONReadingOptions(rawValue: 0)) as? [[String : AnyObject]]) {
            for items in parsed {
                if let item = items as? [String : AnyObject] {
                    let title = item["title"] as? String
                    doSomething(title!)
                }
            }
        }
    } catch let error as NSError {
        print("\(error)")
    }

【问题讨论】:

标签: arrays json swift swift2


【解决方案1】:
   func parseJSON() {
    let path = NSBundle.mainBundle().pathForResource("data1", ofType: "json")
    let jsonData = NSData(contentsOfFile: path!)! as NSData
    do {
        let newJson = try NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers)

        if let otherData = newJson["otherData"] as? NSArray {
            let newData1 = otherData[0]
            if let content = newData1["content"] as? String {
                if let title = newData1["title"] as? String {
                    print(title)
                    print(content)
                }

            }
        }

        if let someData = newJson["someData"] as? NSArray {
            var x = 0
            while x < someData.count {
                if let title = someData[x]["title"] as? String {
                    if let content = someData[x]["content"] as? String {
                        print(title)
                        print(content)
                    }
                }
                x++
            }

        }


    }
    catch {

    }

}

那么,在你的 viewDidLoad 中:

  override func viewDidLoad() {
    parseJSON()
}

编辑:

这是假设您有名为“data1.json”的 json 文件,并且它位于您的项目目录中,如下所示:

如果 json 文件没有这个名字或者在你的项目目录中的其他地方,它不会工作。

【讨论】:

    【解决方案2】:

    读取 JSON 字符串非常简单。

    只有两种集合类型:

    • 字典(或规范中的对象),由一对花括号{} 表示
    • 数组,由一对方括号[]表示

    根据定义,JSON 中的所有键都是 String 类型,因此字典中最不具体的类型是 [String:AnyObject]


    在您的示例中,根对象是一个字典 {},其中包含两个键 someDataotherData,因此创建 JSON 对象的行应该是(没有 if - let

    let parsed = try NSJSONSerialization.JSONObjectWithData(jsonData, options:[]) as! [String:AnyObject]
    

    someData 包含一个字典数组[{...},{...}],在您的示例中,所有值都是字符串,因此您可以将对象限制为[[String:String]] 并使用解析项目

    if let someData = parsed["someData"] as? [[String:String]] {
      for anItem in someData {
        print(anItem["title"]!)
        print(anItem["content"]!)
      }
    }
    

    对于简单的结构,实际上不需要像 SwiftyJSON 这样的第三方库。

    【讨论】:

    • 只是一个注释......“JSON 的早期版本(如 RFC 4627 指定)要求有效的 JSON“文档”必须仅包含一个对象或数组类型——尽管它们可以包含它们中的其他类型。从 RFC 7158 开始删除了此限制,因此 JSON 文档可能完全由任何可能的 JSON 类型值组成。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多