热门标签 | 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


推荐阅读
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
  • 本文介绍了一种求解最小权匹配问题的方法,使用了拆点和KM算法。通过将机器拆成多个点,表示加工的顺序,然后使用KM算法求解最小权匹配,得到最优解。文章给出了具体的代码实现,并提供了一篇题解作为参考。 ... [详细]
  • 现象:[root@localhost~]#dockerrun-d-p9000:80centos:httpdbinsh-cusrlocalbinstart.shd5b2bd5a7bc ... [详细]
  • 导读执行UPDATE时,WEHRE条件列虽已有索引,但还会锁全表,肿么回事?问题描述叶师傅有次上课过程中执行UPDATE测试案例时,发现虽然WHERE条件列已有索 ... [详细]
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社区 版权所有