Skip to content

Repository files navigation

PowerCodable

Data <-> String <-> Any(Swift中的json结构, 本工具中以JSON结构体代替) <-> Model(Codable) 此四种类型数据任何方式转化

1.Bool解码处理

func testBool(){do{letdata:Data=""" [true, false, 0, 1, 2, 3, 4.5, -6.7, null, [], [null], [true], [false], [0], [1], [2], [3], [4.5], [6.7], {}, {"a": "b"}, "", "dfadfad"]""".data(using:String.Encoding.utf8)??Data()letdecoder=PowerJSONDecoder()do{letmodel:[Bool]=try decoder.decode(type:[Bool].self, from: data)XCTAssertEqual(model[0],true)XCTAssertEqual(model[1],false)XCTAssertEqual(model[2],false)XCTAssertEqual(model[3],true)XCTAssertEqual(model[4],false)XCTAssertEqual(model[5],false)XCTAssertEqual(model[6],false)XCTAssertEqual(model[7],false)XCTAssertEqual(model[8],false)XCTAssertEqual(model[9],false)XCTAssertEqual(model[10],false)XCTAssertEqual(model[11],false)XCTAssertEqual(model[12],false)XCTAssertEqual(model[13],false)XCTAssertEqual(model[14],false)XCTAssertEqual(model[15],false)XCTAssertEqual(model[16],false)XCTAssertEqual(model[17],false)XCTAssertEqual(model[18],false)XCTAssertEqual(model[19],false)XCTAssertEqual(model[20],false)XCTAssertEqual(model[22],false)}catch{XCTFail("error")}}

2.Int解码处理

do{letdata:Data=""" [true, false, 0, 1, 2, 3, 4.5, -6.7, null, [], [null], [true], [false], [0], [1], [2], [3], [4.5], [6.7], {}, {"a": "b"}]""".data(using:String.Encoding.utf8)??Data()letdecoder=PowerJSONDecoder()do{letmodel:[Int]=try decoder.decode(type:[Int].self, from: data)XCTAssertEqual(model[0],1)XCTAssertEqual(model[1],0)XCTAssertEqual(model[2],0)XCTAssertEqual(model[3],1)XCTAssertEqual(model[4],2)XCTAssertEqual(model[5],3)XCTAssertEqual(model[6],4)XCTAssertEqual(model[7],-6)XCTAssertEqual(model[8],0)XCTAssertEqual(model[9],0)XCTAssertEqual(model[10],0)XCTAssertEqual(model[11],0)XCTAssertEqual(model[12],0)XCTAssertEqual(model[13],0)XCTAssertEqual(model[14],0)XCTAssertEqual(model[15],0)XCTAssertEqual(model[16],0)XCTAssertEqual(model[17],0)XCTAssertEqual(model[18],0)XCTAssertEqual(model[19],0)XCTAssertEqual(model[20],0)}catch{XCTFail("error")}}

3.Int8解码处理(同上)

4.Int16解码处理(同上)

5.Int32解码处理(同上)

6.Int64解码处理(同上)

7.UInt解码处理(对于小于0的数据默认处理都解码为0, 也可以实现TypeConvertible协议根据需求去处理)

do{letdata:Data=""" [true, false, 0, 1, 2, 3, 4.5, -6.7, null, [], [null], [true], [false], [0], [1], [2], [3], [4.5], [6.7], {}, {"a": "b"}]""".data(using:String.Encoding.utf8)??Data()letdecoder=PowerJSONDecoder()do{letmodel:[UInt]=try decoder.decode(type:[UInt].self, from: data)XCTAssertEqual(model[0],1)XCTAssertEqual(model[1],0)XCTAssertEqual(model[2],0)XCTAssertEqual(model[3],1)XCTAssertEqual(model[4],2)XCTAssertEqual(model[5],3)XCTAssertEqual(model[6],4)XCTAssertEqual(model[7],0)XCTAssertEqual(model[8],0)XCTAssertEqual(model[9],0)XCTAssertEqual(model[10],0)XCTAssertEqual(model[11],0)XCTAssertEqual(model[12],0)XCTAssertEqual(model[13],0)XCTAssertEqual(model[14],0)XCTAssertEqual(model[15],0)XCTAssertEqual(model[16],0)XCTAssertEqual(model[17],0)XCTAssertEqual(model[18],0)XCTAssertEqual(model[19],0)XCTAssertEqual(model[20],0)}catch{XCTFail(error.localizedDescription)}}

8.UInt8解码处理(同上)

9.UInt16解码处理(同上)

10.UInt32解码处理(同上)

11.UInt64解码处理(同上)

12.Float解码处理

do{letdata:Data=""" [true, false, 0, 1, 2, 3, 4.5, -6.7, null, [], [null], [true], [false], [0], [1], [2], [3], [4.5], [6.7], {}, {"a": "b"}]""".data(using:String.Encoding.utf8)??Data()letdecoder=PowerJSONDecoder()do{letmodel:[Float]=try decoder.decode(type:[Float].self, from: data)XCTAssertEqual(model[0],1)XCTAssertEqual(model[1],0)XCTAssertEqual(model[2],0)XCTAssertEqual(model[3],1)XCTAssertEqual(model[4],2)XCTAssertEqual(model[5],3)XCTAssertEqual(model[6],4.5)XCTAssertEqual(model[7],-6.7)XCTAssertEqual(model[8],0)XCTAssertEqual(model[9],0)XCTAssertEqual(model[10],0)XCTAssertEqual(model[11],0)XCTAssertEqual(model[12],0)XCTAssertEqual(model[13],0)XCTAssertEqual(model[14],0)XCTAssertEqual(model[15],0)XCTAssertEqual(model[16],0)XCTAssertEqual(model[17],0)XCTAssertEqual(model[18],0)XCTAssertEqual(model[19],0)XCTAssertEqual(model[20],0)}catch{XCTFail("error")}}

13.Double解码处理(同上)

14.String解码处理

do{letdata:Data=""" [true, false, 0, 1, 2, 3, 4.5, -6.7, null, [], [null], [true], [false], [0], [1], [2], [3], [4.5], [6.7], {}, {"a": "b"}]""".data(using:String.Encoding.utf8)??Data()letdecoder=PowerJSONDecoder()do{letmodel:[String]=try decoder.decode(type:[String].self, from: data)XCTAssertEqual(model[0],"true")XCTAssertEqual(model[1],"false")XCTAssertEqual(model[2],"0")XCTAssertEqual(model[3],"1")XCTAssertEqual(model[4],"2")XCTAssertEqual(model[5],"3")XCTAssertEqual(model[6],"4.5")XCTAssertEqual(model[7],"-6.7")XCTAssertEqual(model[8],"null")XCTAssertEqual(model[9],"[]")XCTAssertEqual(model[10],"[]")XCTAssertEqual(model[11],"[]")XCTAssertEqual(model[12],"[]")XCTAssertEqual(model[13],"[]")XCTAssertEqual(model[14],"[]")XCTAssertEqual(model[15],"[]")XCTAssertEqual(model[16],"[]")XCTAssertEqual(model[17],"[]")XCTAssertEqual(model[18],"[]")XCTAssertEqual(model[19],"[:]")XCTAssertEqual(model[20],"[:]")}catch{XCTFail("error")}}

15.自定义模型与JSONKey对应(常规Codable提供的CodingKey自定义,当只能一对一的转化,本工具可以实现一对多映射,因为鬼知道服务端下发的数据字段啥时候改,或者为了兼容多个字段都他妈下发过来,或者一会下发这个一会下发那个.本工具均可以处理)

do{structRoot:Codable,MappingDecodingKeys{staticfunc modelDecodingKeys()->[String:[String]]{return["info":["a","b"],"b":["b"]]}
/// 模型的info字段接受json字段("a", "b")
letinfo:Boolletb:String}letdata:Data=""" {"a": true, "b": ""}""".data(using:String.Encoding.utf8)??Data()letdecoder=PowerJSONDecoder()do{letmodel=try decoder.decode(type:Root.self, from: data)XCTAssertEqual(model.info,true)}catch{XCTAssertNil(error, error.localizedDescription)}}

还有写特性可见具体的Test,

感谢 JSON 解析功能是照搬的 并不是用Codable内部的功能(因为Codable提供的关于解析过程的比较少),壳子模仿Codable的API,使用方便,欢迎大家提PR!!!共同学习,由于底层不是Codable解析目前支持Bool, Int, Int8, Int16, Int32, Int64, UInt, UInt8, UInt16, UInt32, UInt64, Float, Double, String, URL, Date, Data

About

Swift version Powerful JSON conversion tool.

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages