Swift JSON 序列化可以更简单

1,108 阅读1分钟

前言

由于swift本身特性的限制,处理类似JSON这样的弱类型数据一直不是很友好。用原生自带的Codable协议,但是要应对下面的情况,那就头疼了

  1. key写错了
  2. 类型搞错了
  3. 没有值
  4. 没有这个字段

使用

我们来看看ObjMapper的使用, 详细使用见如何优雅的使用Swift Codable协议

// JSON:
let raw_json = """
{
    "uid":888888,
    "name":"Tom",
    "age":10
}
"""

// Model:
struct Dog: Codable{
    //如果字段不是可选类型,则使用Default,提供一个默认值
    //1. 如果json中没有uid字段,则uid被设置成默认值0
    //2. 如果json中uid的值是字符串,则自动转换成数字,如果转换失败,则被设置成默认值
    @Default<Int.Zero> var uid: Int
    //如果是可选类型,则使用Backed
    //1. 如果json中没有age字段,则age=nil
    //2. 如果json中age的值是字符串,则自动转换成数字
    @Backed var age: Int?
    @Backed var name: String?
}

//JSON to model
let dog = Dog.decodeJSON(from: raw_json)

//model to json
let json = dog.jsonString

规则

记住两个规则就可以了:

  1. 如果我们定义地段是可选类型,则使用@Backed。使用Backed后,如果类型不匹配,则类型会自动转换
  2. 如果字段不是可选类型,则使用@Default,提供一个默认值,如果没有找到该字段的值,则会用默认值代替

相比其他库,对于模型的定义和后期的使用,都简洁了很多。