前面的文章介绍了如何利用KakaJSON进行JSON转Model,从这篇文章开始介绍如何将Model转成JSON

生成JSON和JSONString

struct Car: Convertible {
var name: String = "Bently"
var new: Bool = true
var age: Int = 10
var area: Float = 0.12345678
var weight: Double = 0.1234567890123456
var height: Decimal = 0.123456789012345678901234567890123456789
var price: NSDecimalNumber = NSDecimalNumber(string: "0.123456789012345678901234567890123456789")
var minSpeed: Double = 66.66
var maxSpeed: NSNumber = 77.77
var capacity: CGFloat = 88.88
var birthday: Date = Date(timeIntervalSince1970: 1565922866)
var url: URL? = URL(string: "http://520suanfa.com")
} let car = Car()
// 将模型实例car转为JSON
let json1 = car.kj.JSONObject()
// 也可以调用全局函数`JSONObject(from:)`
let json2 = JSONObject(from: car) // 将模型实例car转为JSONString
let jsonString1 = car.kj.JSONString()
// 也可以调用全局函数`JSONString(from:)`
let jsonString2 = JSONString(from: car)
/* {"birthday":1565922866,"new":true,"height":0.123456789012345678901234567890123456789,
"weight":0.1234567890123456,"minSpeed":66.66,
"price":0.123456789012345678901234567890123456789,"age":10,
"name":"Bently","area":0.12345678,"maxSpeed":77.77,
"capacity":88.88,"url":"http:\/\/520suanfa.com"} */ // 传入`true`代表生成格式化的JSONString
let jsonString3 = car.kj.JSONString(prettyPrinted: true)
let jsonString4 = JSONString(from: car, prettyPrinted: true)
/*
{
"height" : 0.123456789012345678901234567890123456789,
"weight" : 0.1234567890123456,
"minSpeed" : 66.66,
"new" : true,
"maxSpeed" : 77.77,
"age" : 10,
"capacity" : 88.88,
"birthday" : 1565922866,
"name" : "Bently",
"price" : 0.123456789012345678901234567890123456789,
"area" : 0.12345678,
"url" : "http:\/\/520suanfa.com"
}
*/

可选类型

// 可选类型的问号?并不会影响JSON或者JSONString的生成

struct Student: Convertible, Equatable {
var op1: Int? = 10
var op2: Double?? = 66.66
var op3: Float??? = 77.77
var op4: String???? = "Jack"
var op5: Bool????? = true
// op6可以是NSArray\Set<CGFloat>\NSSet\NSMutableArray\NSMutableSet类型
var op6: [CGFloat]?????? = [44.44, 55.55]
} let jsonString = Student().kj.JSONString()
/*
{
"op1" : 10,
"op4" : "Jack",
"op2" : 66.66,
"op5" : true,
"op6" : [
44.44,
55.55
],
"op3" : 77.77
}
*/

Enum

// 遵守了`ConvertibleEnum`协议、带有RawValue的Enum,能自动将RawValue转为JSON

enum Grade: String, ConvertibleEnum {
case perfect = "A"
case great = "B"
case good = "C"
case bad = "D"
} struct Student: Convertible {
var grade1: Grade = .great
var grade2: Grade = .bad
} let jsonString = Student().kj.JSONString()
/* {"grade2":"D","grade1":"B"} */

模型嵌套

struct Book: Convertible {
var name: String = ""
var price: Double = 0.0
} struct Car: Convertible {
var name: String = ""
var price: Double = 0.0
} struct Dog: Convertible {
var name: String = ""
var age: Int = 0
} struct Person: Convertible {
var name: String = "Jack"
var car: Car? = Car(name: "Bently", price: 106.666)
var books: [Book]? = [
Book(name: "Fast C++", price: 666.6),
Book(name: "Data Structure And Algorithm", price: 666.6),
]
var dogs: [String: Dog]? = [
"dog0": Dog(name: "Wang", age: 5),
"dog1": Dog(name: "ErHa", age: 3),
]
} let jsonString = Person().kj.JSONString()
/*
{
"dogs" : {
"dog0" : {
"name" : "Wang",
"age" : 5
},
"dog1" : {
"name" : "ErHa",
"age" : 3
}
},
"books" : [
{
"price" : 666.6,
"name" : "Fast C++"
},
{
"name" : "Data Structure And Algorithm",
"price" : 666.6
}
],
"name" : "Jack",
"car" : {
"price" : 106.666,
"name" : "Bently"
}
}
*/

Any

struct Book: Convertible {
var name: String = ""
var price: Double = 0.0
} struct Dog: Convertible {
var name: String = ""
var age: Int = 0
} struct Person: Convertible {
// `books`也可以是NSArray\NSMutableArray
var books: [Any]? = [
Book(name: "Fast C++", price: 666.6),
Book(name: "Data Structure And Algorithm", price: 666.6),
] // `dogs`也可以是NSDictionary\NSMutableDictionary
var dogs: [String: Any]? = [
"dog0": Dog(name: "Wang", age: 5),
"dog1": Dog(name: "ErHa", age: 3),
]
} let jsonString = Person().kj.JSONString()
/*
{
"dogs" : {
"dog1" : {
"age" : 3,
"name" : "ErHa"
},
"dog0" : {
"age" : 5,
"name" : "Wang"
}
},
"books" : [
{
"name" : "Fast C++",
"price" : 666.6
},
{
"price" : 1666.6,
"name" : "Data Structure And Algorithm"
}
]
}
*/

Model数组

struct Car: Convertible {
var name: String = ""
var price: Double = 0.0
} // `models`也可以是NSArray\NSMutableArray
let models = [
Car(name: "BMW", price: 100.0),
Car(name: "Audi", price: 70.0),
Car(name: "Bently", price: 300.0)
] let jsonString = models.kj.JSONString()
// 也可以使用全局函数`JSONString(from:)`
// let jsonString = JSONString(from: models)
/*
[
{
"name" : "BMW",
"price" : 100
},
{
"price" : 70,
"name" : "Audi"
},
{
"price" : 300,
"name" : "Bently"
}
]
*/

Model Set

struct Car: Convertible, Hashable {
var name: String = ""
var price: Double = 0.0
} let models: Set<Car> = [
Car(name: "BMW", price: 100.0),
Car(name: "Audi", price: 70.0),
Car(name: "Bently", price: 300.0)
] let jsonString = models.kj.JSONString()
/*
[
{
"price" : 70,
"name" : "Audi"
},
{
"price" : 300,
"name" : "Bently"
},
{
"name" : "BMW",
"price" : 100
}
]
*/

Key处理

struct Dog: Convertible {
var nickName: String = "Wang"
var price: Double = 100.6 // 可以通过实现`kj_JSONKey`方法自定义最终生成JSON的key
func kj_JSONKey(from property: Property) -> JSONPropertyKey {
switch property.name {
case "nickName": return "_nick_name_"
default: return property.name
}
}
} let jsonString = Dog().kj.JSONString()
/* {"price":100.6,"_nick_name_":"Wang"} */
  • kj_JSONKey也支持ConvertibleConfig配置,用法类似于kj_modelKey,参考第三篇文章

值过滤

private let dateFmt: DateFormatter = {
let fmt = DateFormatter()
fmt.dateFormat = "yyyy-MM-dd HH:mm:ss"
return fmt
}() struct Student: Convertible {
var birthday: Date? // 可以通过实现`kj_JSONValue`方法自定义最终生成JSON的value
func kj_JSONValue(from modelValue: Any?, _ property: Property) -> Any? {
if property.name != "birthday" { return modelValue }
// 将`birthday`格式化成字符串后放入JSON
return birthday.flatMap(dateFmt.string)
}
} let time = "2019-08-13 12:52:51"
let date = dateFmt.date(from: time)
let student = Student(birthday: date)
let jsonString = student.kj.JSONString()
/* {"birthday":"2019-08-13 12:52:51"} */
  • kj_JSONValue也支持ConvertibleConfig配置,用法类似于kj_modelKey,参考第三篇文章

监听

struct Car: Convertible {
var name: String = "Bently"
var age: Int = 10 // 当Model即将开始转换为JSON时调用
func kj_willConvertToJSON() {
print("Car - kj_willConvertToJSON")
} // 当Model转换JSON完毕时调用
func kj_didConvertToJSON(json: [String: Any]) {
print("Car - kj_didConvertToJSON", json)
}
}

【KakaJSON手册】06_Model转JSON的更多相关文章

  1. 【KakaJSON手册】01_JSON转Model_01_基本用法

    在iOS开发中,后台返回的数据大多是JSON格式,对应地会被网络框架层解析成Swift中的Dictionary.Array.由于数据类型的复杂.字段的繁多,直接使用Dictionary.Array会比 ...

  2. 【KakaJSON手册】04_JSON转Model_04_值过滤

    在KakaJSON手册的第2篇文章中提过:由于JSON格式能表达的数据类型是比较有限的,所以服务器返回的JSON数据有时无法自动转换成客户端想要的数据类型 比如客户端想要的是Date类型,服务器返回的 ...

  3. 【KakaJSON手册】02_JSON转Model_02_数据类型

    由于JSON格式的能表达的数据类型是比较有限的,所以服务器返回的JSON数据有时无法自动转换成客户端想要的数据类型. 比如服务器返回的时间可能是个毫秒数1565480696,但客户端想要的是Date类 ...

  4. 【KakaJSON手册】03_JSON转Model_03_key处理

    有时候,服务器返回的JSON数据的key跟客户端模型的属性名可能不一致,比如客户端遵守驼峰规范叫做nickName,而服务器端返回的JSON可能叫做nick_name.这时候为了保证数据转换成功,就需 ...

  5. 【KakaJSON手册】05_JSON转Model_05_动态模型

    在上一篇文章中提到:有时候服务器返回的某个字段的内容类型可能是不确定的 当时给出的解决方案是实现kk_modelValue或者kk_didConvertToModel方法,根据实际需求自定义JSON的 ...

  6. 【KakaJSON手册】08_其他用法

    除了完成JSON和Model的转换之外,KakaJSON内部还有很多实用的功能,有些也开放为public接口了 遍历属性 struct Cat { var age: Int = 0 let name: ...

  7. 【KakaJSON手册】07_Coding_归档_解档

    KakaJSON可以只用一行代码将常用数据进行归档\解档 后面代码中会用到 file 文件路径 // 文件路径(String或者URL都可以) let file = "/Users/mj/D ...

  8. PHP json编码遇到的问题

    今天遇到了json编码解码之后中文消失的问题,一探究竟,写下这篇文章 PHP中提供了json_encode  和json_decode 这对函数 将PHP中 值转化成 字符串,但是遇到中文的时候,很容 ...

  9. javaScript系列 [09]-javaScript和JSON (拓展)

    本文输出JSON搜索和JSON转换相关的内容,是对前两篇文章的补充. JSON搜索 在特定的开发场景中,如果服务器端返回的JSON数据异常复杂(可能超过上万行),那么必然就有对JSON文档进行搜索的需 ...

随机推荐

  1. 彻底透析SpringBoot jar可执行原理

    ​ 文章篇幅较长,但是包含了SpringBoot 可执行jar包从头到尾的原理,请读者耐心观看.同时文章是基于SpringBoot-2.1.3进行分析.涉及的知识点主要包括Maven的生命周期以及自定 ...

  2. JavaScript权威指南第六版(阅读笔记)

    前言: 对于软件行业学习是无止境的,因为知识更替非常快,能够快速稳固掌握一门新技术是一个程序员应该具备的基本素质. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思想需要细心和大量实践才能慢慢 ...

  3. .NET CORE 多语言实现方案

    根据市场需求,基于.NET CORE平台开发的RoadFlow工作流平台需要实现多语言版本.经过方案讨论和比对,决定采用.NET自带的本地化功能来实现多语言.话不多说,直接上实现方式. 首先修改Sta ...

  4. MySQL常见操作指令

    1:使用SHOW语句找出在服务器上当前存在什么数据库: mysql> SHOW DATABASES; 2:创建一个数据库MYSQLDATA mysql> CREATE DATABASE M ...

  5. vs查看派生类

    把类名拷贝到类视图中,点“派生类型”可看到此类的所有派生类.

  6. Docker 环境下搭建nexus私服

    一.安装docker 1.脚本安装 本机环境CentOS7,用户为root 下载脚本到工作目录 curl -fsSL https://get.docker.com -o get-docker.sh 执 ...

  7. 吐槽下Excel的十大不规范使用问题

    Excel是个老少咸宜的软件工具,这是不争的事实,无论哪个级别的用户,都能在乐在其中.但问题是太多的人群因为不懂得正确的使用姿势,硬生生地把Excel玩得让人啼笑皆非,同样留给接手者一个难堪无比的烂摊 ...

  8. [Github]watch和star的区别

    1. Watch Issues 以及它们的评论 Pull Requests 及评论 对任何提交的评论 如果没有watch,只有在参与了讨论的情况下会接收到提醒 : 被 @ 提及 被分配 Issues ...

  9. golang 任意类型之间相互转换

    在处理一些参数的时候,可能需要将参数转换为各种类型,这里实现一个通用的转换函数,实现各种类型之间的相互转换. 当然,如果源数据格式和目标数据类型不一致,是会返回错误的.例如将字符串“一二三”转换为数值 ...

  10. 用margin还是padding ?

    margin是用来隔开元素与元素的间距:padding是用来隔开元素与内容的间隔. margin用于布局分开元素使元素与元素互不相干:padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元 ...