欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Swift中使用JSON

程序员文章站 2022-06-01 10:54:00
...

JSON数据格式已在现代Web中广泛使用,它是最常用的数据传输方式之一。 许多现代的API,特别是RESTful Web服务,都支持JSON数据格式。

在本教程中,我将向您展示如何在iOS,tvOS,watchOS和OS X上以Swift编程语言使用JSON数据格式。

先决条件

本教程要求您至少运行Xcode 7,其中包括Swift编程语言的版本2。 Swift 2引入了许多重要的补充,我们将在本教程中使用这些补充,例如错误处理和guard语句。

1.什么是JSON?

就像我提到的那样,JSON是一种常用的数据格式,用于例如客户端和服务器之间的通信。 它之所以受欢迎,是因为它在几乎所有移动平台(如iOS,Android,Windows Phone和Web浏览器)上的可用性。

以下代码段是JSON数据格式的示例。 这是我们在本教程中将使用的代码段。

{
  "dataTitle": "JSON Tutorial!",
  "swiftVersion": 2.1
  
  "users": [
    {
      "name": "John",
      "age": 25
    },
    {
      "name": "Mark",
      "age": 29
    },
    {
      "name": "Sarah",
      "age": 22
    }
  ],
}

如您所见,JSON数据格式很容易理解。 JSON使用两种集合类型(字典和数组)进行结构化。 字典包含一个或多个键值对,并用花括号{}括起来。 数组包含订购商品的列表,并用方括号[]括起来。 几乎每种编程语言都定义了这些集合类型,这就是为什么几乎每种语言都支持JSON的原因。

以下是JSON对象中支持的数据类型的列表:

  • 数字(整数,浮点数,双精度数等)
  • 布尔型
  • 数组
  • 字典

JSON之所以如此流行,部分原因是因为它易于人类阅读,并且也可以由机器轻松解析和序列化。 解析和序列化是指机器获取原始数据并将其转换为应用程序可以使用的对象时。

2.读取JSON数据

步骤1:建立游乐场

启动Xcode并创建一个新的游乐场。 给操场命名,并将Platform设置为iOS

步骤2:添加JSON数据

打开左侧的导航器 ,然后展开JSON游乐场。 右键单击“ 资源”文件夹,然后从菜单中选择“ 新建文件 ”。

在Swift中使用JSON

将文件命名为data.json并使用以下JSON填充文件。

{
  "users": [
    {
      "name": "John",
      "age": 25
    },
    {
      "name": "Mark",
      "age": 29
    },
    {
      "name": "Sarah",
      "age": 22
    }
  ],
  "dataTitle": "JSON Tutorial!",
  "swiftVersion": 2.1
}

步骤3:取得资料

现在您已经对JSON数据格式有了基本的了解,是时候开始在Swift中使用它了。 删除游乐场的内容,并向其中添加以下三行代码。

import UIKit

let url = NSBundle.mainBundle().URLForResource("Data", withExtension: "json")
let data = NSData(contentsOfURL: url!)

通过此代码,我们获得了对刚才添加到操场上的JSON文件的引用,并将其内容作为原始数据获取。 请注意,我们在此处创建的URL是您计算机上文件的本地URL。 这可以是Web服务的URL或您可能需要的任何其他URL。

理解不必以这种方式收集JSON对象的原始数据也很重要。 唯一必要的部分是原始NSData对象,它可以来自示例中所示的URL,API响应或其他一系列来源。

步骤4:解析数据

下一步是将这些数据解析并序列化为我们可以使用的对象。 幸运的是,在iOS和OS X上,Foundation NSJSONSerialization类可以为您处理所有NSJSONSerialization的解析和序列化工作。 将以下代码段添加到您的游乐场。

do {
    let object = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)
    if let dictionary = object as? [String: AnyObject] {
        readJSONObject(dictionary)
    }
} catch {
    // Handle Error
}

首先,我们将所有逻辑封装在do-catch语句中,因为从JSON数据进行序列化有可能引发错误。 接下来,我们调用NSJSONSerialization类的JSONObjectWithData(_:options:)方法,传入NSData对象和一些选项。 可以传入的选项由NSJSONReadingOptions结构定义:

  • AllowFragments允许读取JSON数据的第一层或顶层内不是数组或字典的对象。 在本教程中使用的JSON数据中,这包括dataTitleswiftVersion值。
  • MutableLeaves此选项允许从JSON数据读取的字符串作为NSMutableString实例自动创建。 此选项与Objective-C开发更相关。 在Swift中,您可以忽略此选项,因为字符串是内置的基本数据类型,并且在使用var关键字定义时会自动可变。
  • MutableContainers这允许从JSON数据读取数组和字典也是可变的。 与Swift中的MutableLeaves选项一样,在将数组/字典分配给变量时,使用var关键字会自动使其可变。

最后,我们检查序列化的对象是否具有预期的[String: AnyObject]类型,如果是,则调用readJSONObject(_:)函数。 让我们看一下readJSONObject(_:)方法。

步骤5:使用数据

一旦对收集到的JSON数据进行了解析和序列化,就可以与其他任何字典进行交互。 do-catch语句上方 ,将以下函数添加到您的游乐场。

func readJSONObject(object: [String: AnyObject]) {
    guard let title = object["dataTitle"] as? String,
        let version = object["swiftVersion"] as? Float,
        let users = object["users"] as? [[String: AnyObject]] else { return }
    _ = "Swift \(version) " + title
    
    for user in users {
        guard let name = user["name"] as? String,
            let age = user["age"] as? Int else { break }
        switch age {
        case 22:
            _ = name + " is \(age) years old."
        case 25:
            _ = name + " is \(age) years old."
        case 29:
            _ = name + " is \(age) years old."
        default:
            break
        }
    }
}

如您所见,序列化的JSON数据可以与常规字典或数组完全相同的方式进行交互。 上面的readJSONObject(_:)函数用作如何从序列化JSON对象提取信息的示例。 请注意,我在函数中包含一个switch语句,只是为了分隔运动场输出中的字符串。

一旦Playground完成执行代码,您将在侧栏中看到类似于以下内容的结果。

在Swift中使用JSON

恭喜你 现在,您知道如何获取JSON数据,对其进行序列化并将其用作Swift代码中的普通字典。 如您所见,感谢NSJSONSerialization API,该过程非常简单,它为我们完成了大部分艰苦的工作。

3.编写JSON数据

除了读取从在线资源或本地文件接收的JSON数据外,了解如何创建自己的JSON数据也很重要。 无论是将其保存为本地文件还是最常见的是发送至Web服务,其处理过程都与读取JSON数据一样简单。 看下面的例子。

let validDictionary = [
    "numericalValue": 1,
    "stringValue": "JSON",
    "arrayValue": [0, 1, 2, 3, 4, 5]
]

let invalidDictionary = [
    "date": NSDate()
]

if NSJSONSerialization.isValidJSONObject(validDictionary) { // True
    do {
        let rawData = try NSJSONSerialization.dataWithJSONObject(validDictionary, options: .PrettyPrinted)
    } catch {
        // Handle Error
    }
}

if NSJSONSerialization.isValidJSONObject(invalidDictionary) { // False
    // NSJSONSerialization.dataWithJSONObject(validDictionary, options: .PrettyPrinted) will produce an error if called
}

从对象创建自己的JSON数据时,最好首先使用isValidJSONObject(_:)方法检查该对象是否可以转换为JSON对象。

进行此初始检查后,您调用dataWithJSONObject(_:)方法,如果成功,该方法将返回NSData对象。 因为我们已经检查了对象是否有效,所以这里的错误catch块不像以前那么重要,但是由于在创建原始数据时内部API错误,它仍可能被调用。

本示例中使用的PrettyPrinted选项是可用于此方法的唯一选项,并且在使用时,只是将更多的空格添加到JSON数据中以使其更易于阅读。

// With PrettyPrinted Option:
{
    "name": "John",
    "age": 25
}

// Without PrettyPrinted Option:
{"name":"John","age": 25}

然后可以根据需要使用返回的NSData对象。 您可以将其保存到本地文件或将其发送到Web服务。

结论

您现在应该可以轻松在Swift中使用JSON了。 显然,明星玩家是NSJSONSerialization类,在一些guarddo-catch语句的帮助下。 如您所见,使用JSON数据非常容易。 解析并序列化JSON数据后,就可以与其他任何常规对象进行交互了。

与往常一样,请务必在下面的评论中留下您的评论和反馈。

翻译自: https://code.tutsplus.com/tutorials/working-with-json-in-swift--cms-25335