使用Codable实现JSON转对象、对象转JSON

使用Codable实现JSON转对象、对象转JSON

========================

先上代码,这里我是在Swift playground中运行,方便演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
import UIKit
import Foundation

// MARK: - Decode

struct User: Codable { // 基本类型组合默认遵守Codable协议
var name: String
var age: Int
}

let jsonStr = """
{
"name": "Ryan",
"age": 18
}
"""

let jsonData = jsonStr.data(using: .utf8)!

let decoder = JSONDecoder()

do {
let userObj = try decoder.decode(User.self, from: jsonData)
print("userObj = \(userObj)")
} catch {
print("decode error")
}

// MARK: - Encode

let user = User(name: "Lux", age: 20)

let encoder = JSONEncoder()

do {
let data = try encoder.encode(user)
let jsonStr = String(data: data, encoding: .utf8)!
print("jsonStr = \(jsonStr)")
} catch {
print("encode error")
}



struct Introduction: Identifiable, Codable {
var id = UUID()
var idForDataBase: Int64
var image: String
var title: String
var text: String
//这里的date原是想要展示日期,现在就用于当备注
var date: String
}
class I18n {
class func localizedString(_ key: String?) -> String {
guard let key = key else { return "" }
return NSLocalizedString(key, tableName: nil, bundle: Bundle(for: I18n.self), value: "", comment: "")
}
}
let culturalRelicsData = [
Introduction(idForDataBase: Int64.init(20210303063005), image: "郎窑红釉穿带直口瓶", title: I18n.localizedString("bottle"), text: I18n.localizedString("郎窑红釉穿带直口瓶,清康熙,高20.8cm,口径6.1cm,足径9.1cm。瓶直口,长颈,垂腹,圈足外撇。足外墙两侧各有一长方形穿孔,可穿系绳带。在容器上系带是对无梁、无系、无扳手的器物进行提拿的传统方法,拆卸容易而又非常实用,也可以使器物在摆放位置上固定,不致被损坏。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063006), image: "张成造款雕漆云纹盒", title: I18n.localizedString("box"), text: I18n.localizedString("张成是元代雕漆大家,其传世作品被一致认为是雕漆作品里的珍品。张成造款雕漆云纹盘为故宫漆器的代表作品。高3.3cm,口径19.2cm.盘木胎黑漆,内外均雕云纹。堆漆甚厚,晶莹照人,刻工圆润。从此件具款的剔犀圆盘可知张成不仅是剔红高手,剔犀技巧也精湛至极,此盘为研究元代剔犀工艺提供了实例。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063007), image: "彩漆描金楼阁式自开门群仙祝寿御制钟", title: I18n.localizedString("clock"), text: I18n.localizedString("黑漆彩绘楼阁群仙祝寿钟为故宫钟表的代表作。高185cm,面宽102cm,侧宽70cm.此钟共有7套机械系统,分别控制走时、报时、景箱内的活动装置等,技术水准相当高。根据记录,从乾隆八年接旨着手设计到十四年完工,历时五年多。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063008), image: "乾隆款金瓯永固杯", title: I18n.localizedString("cup"), text: I18n.localizedString("宫廷之宝乾隆款金瓯永固杯为故宫宫廷文物的代表作。高12.5厘米,口径8厘米,足高5厘米,口边刻有回纹。根据清“内务府活计档”记载,乾隆皇帝对此杯的制作十分重视,不仅调用内库黄金、珍珠、宝石等珍贵材料,而且精工细作,曾多次修改,直至皇帝满意为止。因此,该杯一直被清代皇帝视为珍贵的祖传法宝。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063009), image: "掐丝珐琅缠枝莲纹象耳炉", title: I18n.localizedString("ear_furnace"), text: I18n.localizedString("掐丝珐琅缠枝莲纹象耳炉,元,通高13.9cm,口径16cm,足径13.5cm。清宫旧藏。炉铜胎,圆形,鼓腹,象首卷鼻耳,圈足。炉颈部浅蓝釉地,饰黄、白、红、紫四色菊花12朵。腹部宝蓝釉地,饰红、白、黄三色掐丝珐琅缠枝莲花6朵。其下饰莲瓣纹一周。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063010), image: "青玉云龙纹炉", title: I18n.localizedString("grain_furnace"), text: I18n.localizedString("青玉云龙纹炉为故宫玉器的代表作品。宋代出品,高7.9cm,口径12.8cm.炉青玉质。通体以“工”字纹为底,上饰游龙、祥云和海水纹。器内底阴刻乾隆七言诗一首:“何年庙器赞天经,刻作飞龙殿四灵。毛伯邢侯异周制,祖丁父癸似商形。依然韫匵阅桑海,所惜从薪遇丙叮土气羊脂胥变幻,只余云水淡拖青。”"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063011), image: "清明上河图", title: I18n.localizedString("painting"), text: I18n.localizedString("《清明上河图》为故宫书画代表作品,该画为张择端所作,以精致的工笔记录了北宋末叶、徽宗时代首都汴京(今开封)郊区和城内汴河两岸的建筑和民生。全图分为三个段落。作品以长卷形式,采用散点透视的构图法,将繁杂的景物纳入统一而富于变化的画面中。在5米多长的画卷里,共绘了550多个各色人物。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063012), image: "平复帖", title: I18n.localizedString("placard"), text: I18n.localizedString("西晋陆机的《平复帖》是故宫法帖的代表作品,也是目前存世最早的名人墨迹,内容为陆机向朋友问候疾病的书札。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063013), image: "酗亚方尊", title: I18n.localizedString("zun"), text: I18n.localizedString("青铜之宝酗亚方尊为故宫青铜器的代表作品。青铜器的产生是古代中国从野蛮时代走向文明时代的重要标志之一。尊是盛酒器,流行于商早期至春秋战国时期。方尊传世较少。上世纪70年代在山东益都苏埠屯出土了几件带有亚铭文的青铜器,从挖掘的墓穴来看,规模都不小,加上众多带有亚铭记的器物,说明它们所代表的可能是一个大族。"), date: I18n.localizedString("故宫镇馆之宝")),
Introduction(idForDataBase: Int64.init(20210303063014), image: "沈子蕃缂丝《梅鹊图》轴", title: I18n.localizedString("magpie"), text: I18n.localizedString("沈子蕃缂丝《梅鹊图》轴为故宫织绣的代表作品。图轴纵104cm,宽36cm.中国古代缂丝被认为是丝织工艺中最为高贵的品种,古人以“一寸缂丝一寸金”言缂丝作品之珍贵。缂丝之高贵,首先因其耗费工时巨大,以万缕千丝成其工巧,其次,缂技易学难精,虽摹缂书画,并非简单的照葫芦画瓢。"), date: I18n.localizedString("故宫镇馆之宝"))
]
let encoder2 = JSONEncoder()
do {
let data = try encoder2.encode(culturalRelicsData)
let jsonStr = String(data: data, encoding: .utf8)!
print("jsonStr = \(jsonStr)")
} catch {
print("encode error")
}

JSON转对象

对象转JSON