热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Swift之JSONEncoder和JSONDecoder

Swift之JSONEncoder和JSONDecoder摘自官方文档:Atypethatcanconvertitselfintoandoutofanextern

Swift 之 JSONEncoder 和 JSONDecoder

摘自官方文档:

/// A type that can convert itself into and out of an external representation.
///
/// `Codable` is a type alias for the `Encodable` and `Decodable` protocols.
/// When you use `Codable` as a type or a generic constraint, it matches
/// any type that conforms to both protocols.
public typealias Codable = Decodable & Encodable

对象进行jsonEncode和jsonDecode

一个对象如果需要被编码/解码的话,该对象所属的类需要遵循 Decodable & Encodable 协议。

以 Player 这类为例,Player遵循了 Decodable 和 Encodable

import Foundationstruct Player: Codable {var name: Stringvar highScore: Int = 0var history: [Int] = []enum CodingKeys: String, CodingKey {case name = "Name"case highScore = "HighScore"case history = "History"}init(_ name: String) {self.name = name}
}//Codable, Equatable
extension Player {mutating func updateScore(_ newScore: Int) {history.append(newScore)if highScore < newScore {print("\(newScore)! A new high score for \(name)! &#x1f389;")highScore &#61; newScore}}
}

初始化一个Player对象&#xff0c;并对其进行编码和解码&#xff0c;看看编码和解码之后的数据

var jsonData: Data?// MARK: encode&#xff08;编码&#xff09;// Player对象
var player &#61; Player("Tomas")
// 设置歌手分数
player.updateScore(50)
// 初始化一个encoder对象
let encoder &#61; JSONEncoder()
do {// 将player对象encod&#xff08;编码&#xff09;let data: Data &#61; try encoder.encode(player)// 打印print(data)print(String(data: data, encoding: String.Encoding.utf8) as Any)print(player)jsonData &#61; data
} catch {}// MARK: decode&#xff08;解码&#xff09;
let decoder &#61; JSONDecoder()
do {// 解码得到player对象let player: Player &#61; try decoder.decode(Player.self, from: jsonData!)// 打印print(player)print(player.name)
} catch {}

一个对象被jsonEncode后&#xff0c;对象将被转成 Data 类型的数据。
再将对象的 Data 数据通过jsonDecode&#xff0c;可以还原原来的对象。

通过对对象的json编码和解码&#xff0c;有助于我们理解数据在计算机中的存储。Data 其本质就是二进制流。


JSON字符串转模型

这是一个字符串

let jsonString: String &#61; """
{"name" : "Tomas","highScore" : 50,"history" : [30, 40, 50]
}
"""

如何将其解析成player对象&#xff1f;

// 将JSON字符串转成 Data
let jsonData: Data &#61; jsonString.data(using: String.Encoding.utf8)!
// 将 data 转成对象
let decoder &#61; JSONDecoder()
do {// 解码得到player对象let player: Player &#61; try decoder.decode(Player.self, from: jsonData)// 打印print(player)print(player.name)
} catch {}

这种情况多用于客户端向服务端发送HTTP请求之后&#xff0c;解析返回数据&#xff0c;如果后台返回的是标准的JSON字符串的话直接这样解析就可以了。


JSONSerialization

Serialization 是序列化的意思&#xff0c;JSONSerialization 顾名思义是对JSON进行序列化。

JSONSerialization 是对 JSON 字符串进行序列化和反序列化的工具类。用这个类可以将JSON转成对象&#xff0c;也可以将对象转成JSON。


  • objc 转 json

let dict: [String: Any] &#61; ["name" : "Tomas","highScore" : 50,"history" : [30, 40, 50]
]
if JSONSerialization.isValidJSONObject(dict) &#61;&#61; false {return
}
// 将objc转成data
let data: Data &#61; try! JSONSerialization.data(withJSONObject: dict, options: .fragmentsAllowed)
// 将data转成字符串输出
let string &#61; String(data:data, encoding: String.Encoding.utf8)
print(string as Any)

打印结果&#xff1a;

Optional("{\"history\":[30,40,50],\"name\":\"Tomas\",\"highScore\":50}")

这是一个标准的&#xff0c;带转义的JSON字符串。也就是说我们将字典转成了JSON字符串。


  • json 转 objc

let jsonString &#61; "{\"history\":[30,40,50],\"name\":\"Tomas\",\"highScore\":50}"
let data &#61; jsonString.data(using: String.Encoding.utf8)
let dict &#61; try! JSONSerialization.jsonObject(with: data!, options: .allowFragments)
print(dict)

打印结果&#xff1a;

{highScore &#61; 50;history &#61; (30,40,50);name &#61; Tomas;
}

参考

[1] JSONEncoder文档&#xff1a;https://developer.apple.com/documentation/foundation/jsonencoder/
[2] JSONDecoder文档&#xff1a;https://developer.apple.com/documentation/foundation/jsondecoder
[3] JSONSerialization文档&#xff1a;https://developer.apple.com/documentation/foundation/jsonserialization


推荐阅读
author-avatar
mobiledu2502861407
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有