SwiftUI-JSON序列化、反序列化

拼搏现实的明天。 2022-09-05 12:49 500阅读 0赞

Swift5 自带解析

  1. extension Encodable{
  2. func toJson() -> String {
  3. return String(data: try! JSONEncoder().encode(self), encoding: .utf8) ?? ""
  4. }
  5. }
  6. extension String{
  7. func toModel<T:Decodable>() -> T? {
  8. do{
  9. return try JSONDecoder().decode(T.self, from: self.data(using: .utf8)!)
  10. }catch{
  11. }
  12. return nil
  13. }
  14. }

结构体实现 Codable 协议:里面的字段为基础类型或者结构体(结构体实现 Codable),不能有 protocol 类型

具体示例

  1. /// 界面元素
  2. struct MUIContent:Codable{
  3. var key : String
  4. var desc : String?
  5. var content : String // 元素内容
  6. init<T : MUI>(mui:T) {
  7. self.key = T.key
  8. self.desc = mui.desc
  9. self.content = mui.toJson()
  10. }
  11. }
  12. protocol MUI:Codable{
  13. static var key : String {
  14. get}
  15. var desc : String? {
  16. get}
  17. }
  18. /// 小组件数据
  19. struct MWidget: Codable{
  20. var list: [MUIContent] = [] //元素列表
  21. var backgroud: MWidgetBackgroud?
  22. mutating func append<T:MUI>(t:T) {
  23. let content = MUIContent(mui: t)
  24. list.append(content)
  25. }
  26. }
  27. /// 小组件背景
  28. struct MWidgetBackgroud:Codable {
  29. var color:Int = 0xFFFFFFFF
  30. var image:String?
  31. var borderWidth:Float = 0
  32. var borderColor:Int = 0xFFFFFFFF
  33. }
  34. struct MDateUI : MUI {
  35. static var key: String = "date"
  36. var desc: String? {
  37. let dateFormatter = DateFormatter()
  38. dateFormatter.dateFormat = "yyyy-MM-dd"
  39. dateFormatter.locale = Locale.current
  40. return dateFormatter.string(from: Date())
  41. }
  42. var offsetX: Float = 0
  43. var offsetY: Float = 0
  44. var fontSize: Float = 14
  45. }
  46. let KEY_DATE = "date"
  47. let KEY_TIME = "time"
  48. struct MTimeUI : MUI {
  49. static var key: String = "time"
  50. var desc: String? {
  51. let dateFormatter = DateFormatter()
  52. dateFormatter.dateFormat = "HH:mm"
  53. dateFormatter.locale = Locale.current
  54. return dateFormatter.string(from: Date())
  55. }
  56. var offsetX: Float = 0
  57. var offsetY: Float = 0
  58. var fontSize: Float = 14
  59. }
  60. let MUIKeyMapp:[String:Any] = [
  61. KEY_TIME : MTimeUI.self,
  62. KEY_DATE : MDateUI.self
  63. ]
  64. extension Encodable{
  65. func toJson() -> String {
  66. return String(data: try! JSONEncoder().encode(self), encoding: .utf8) ?? ""
  67. }
  68. }
  69. extension String{
  70. func toModel<T:Decodable>() -> T? {
  71. do{
  72. return try JSONDecoder().decode(T.self, from: self.data(using: .utf8)!)
  73. }catch{
  74. }
  75. return nil
  76. }
  77. }
  78. var m = MWidget()
  79. m.append(t: MDateUI())
  80. m.append(t: MTimeUI())
  81. print(m.toJson())
  82. let mJson = #"""
  83. {
  84. "list":[{
  85. "key":"date","desc":"2021-08-04","content":"{\"offsetX\":10,\"offsetY\":10,\"fontSize\":14}"},{
  86. "key":"time","desc":"11:03","content":"{\"offsetX\":11,\"offsetY\":11,\"fontSize\":24}"}]}
  87. """#

欢迎和我一起交流学习

  • 个人网站: https://hanks.pub
  • Github: https://github.com/hanks-zyh
  • zhihu: https://www.zhihu.com/people/yuhan-zhang-36
  • 微信公众号:Hanks软件库

文章来自: http://hanks-zyh.github.io/

发表评论

表情:
评论列表 (有 0 条评论,500人围观)

还没有评论,来说两句吧...

相关阅读

    相关 序列序列

    序列化和反序列化   摘要   序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没

    相关 序列序列

    个人学习理解 (只是自己默写序列化和反序列的代码以及几个问题) 1.序列化 和 反序列化 1.1 什么是序列化 和 反序列化 或者 你如何理解序列化和

    相关 序列序列

    序列化: 对象的序列化主要有两种用途:   1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;   2) 在网络上传送对象的字节序列。   

    相关 Java序列序列

    目录 1:什么是序列化、反序列化? 2:序列化的用途? 3:序列化的n种方式 1:什么是序列化、反序列化? 把对象转换为字节序列的过程称为对象的序列化