Swift JSON和对象的转换类JSONSerialization
Swift JSON和对象的转换类JSONSerialization

Swift JSON和对象的转换类JSONSerialization

JSONSerialization 是 Swift 和 Objective-C 中用于将 JSON 数据转换为 Swift 对象,或将 Swift 对象转换为 JSON 数据的类。它支持解析 JSON 格式的数据,将其转换成字典、数组等常用 Swift 类型,也可以将 Swift 对象编码成 JSON 格式的数据,便于网络请求的发送和接收。

JSONSerialization 的基本用法

1、将 JSON 数据转换为 Swift 对象

这种方法通常用于从服务器获取 JSON 格式的数据,然后将其解析成 Swift 的字典、数组等类型。

import Foundation

let jsonData = """
{
    "name": "Alice",
    "age": 25,
    "city": "New York"
}
""".data(using: .utf8)!

if let jsonObject = try? JSONSerialization.jsonObject(with: jsonData, options: []) {
    if let jsonDict = jsonObject as? [String: Any] {
        print("JSON 解析结果: \(jsonDict)")
    }
}

在此例中,JSONSerialization.jsonObject 方法会将 JSON 数据转换为 [String: Any] 字典,便于在 Swift 中操作。

常用的 options 有:

.mutableContainers:生成的容器(数组或字典)是可变的 (NSMutableArray 或 NSMutableDictionary)。

.mutableLeaves:允许最底层的内容(如字符串或数字)是可变的。在现代 Swift 中几乎不用。

.fragmentsAllowed:允许解码的数据是 JSON 片段而不是标准 JSON 格式(顶层可以是非容器类型)。

2、将 Swift 对象编码成 JSON 数据

当需要将数据以 JSON 格式发送给服务器时,可以将字典、数组等转换为 JSON 格式的 Data。

let dict: [String: Any] = [
    "name": "Alice",
    "age": 25,
    "city": "New York"
]

if let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted) {
    print("JSON 编码结果: \(String(data: jsonData, encoding: .utf8) ?? "")")
}

这里,data(withJSONObject:options:) 将字典转换成了 JSON 格式的 Data,可以进一步用于网络请求。

常用的 options 有:

.prettyPrinted:格式化输出,生成的 JSON 包含换行和缩进,使内容更易读(适合调试)。

.sortedKeys:将 JSON 输出中的键按字母顺序排序。

.fragmentsAllowed:允许顶层的 JSON 数据是单个值(比如字符串或数字),而不必是数组或字典。适用于非标准的 JSON 场景。

let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: [.prettyPrinted, .sortedKeys])

常用方法

jsonObject(with:options:):用于将 JSON 数据转换为 Swift 类型对象。

if let jsonObject = try? JSONSerialization.jsonObject(with: jsonData, options: .mutableContainers) {
    print("解码结果: \(jsonObject)")
}

data(withJSONObject:options:):用于将 Swift 类型对象转换为 JSON 格式的数据。

let jsonData = try? JSONSerialization.data(withJSONObject: dict, options: .prettyPrinted)

注意事项

JSONSerialization 不支持自定义类型的直接转换,比如自定义的类或结构体,通常需要转换成字典或数组再进行序列化。

数据结构需要符合 JSON 格式要求。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注