Skip to content

Swift Json-Model automatic mapping Swift版JsonModel自动映射

License

Notifications You must be signed in to change notification settings

TifaTsubasa/TTReflect

Repository files navigation

TTReflect

Alt text

swift版 json转model 框架

CocoaPods Compatible Platform

Swift4+推荐官方的Codable 和 JSONDecoder,项目中有可参考的代码

JSONDecoder 和 TTReflect的对比

JSONDecoder:
√ JSONDecoder是原生支持
√ 使用结构体(值类型)作为模型
√ 映射对象和数组属性时更简单
× 有自定义的属性映射时需要重写所有属性
× 无法映射不同类型的属性

TTRflect:
√ 自定义的属性映射只需要改写相应的属性
√ 全面的类型映射,对json有更高的容错性
× 使用Class作为模型,需要依赖NSObject的KVC (致命问题)

适配 Swift 4+ (iOS 8+)

  1. 切换到master分支, 手动拖拽Reflect.swift文件到你的项目中

  2. CocoaPods

pod 'TTReflect', '~> 4.0.0'

适配 Xcode8 & Swift3 (iOS 8+)

  1. 切换到swift3分支, 手动拖拽Reflect.swift文件到你的项目中

  2. CocoaPods (版本1.1.1或更高)

pod 'TTReflect', '~> 3.0.0'

适配 Swift2.3 (iOS 8+)

  1. 切换到swift2.3分支, 手动拖拽Reflect.swift文件到你的项目中

  2. Cocoapods

pod 'TTReflect', '2.1.0'

安装

iOS 7

手动导入

Reflect.swift拖到项目中即可使用

iOS 8+

使用CocoaPods安装
platform :ios, '8.0'
use_frameworks!
pod 'TTReflect', '~> 3.0'

使用前需要导入框架

import TTReflect

=======

使用

推荐模型样式

class Tag: NSObject {
    var count: Int = 0
    var name: String = ""
    var title: String = ""
    var isOpen: Bool = false
}

推荐所有的属性都使用默认值,能够避免在原始数据错误时,过多的可选判断或空对象崩溃

1.模型需要继承于NSObject

2.Int等基本属性需要设置默认值

3.对象属性可以使用可选类型

各类模型定义方式,详见 测试模型

关键方法

// e.g. 模型为Tag类
// convert json to object
let tag = Reflect<Tag>.mapObject(json: json)
// convert data to object
let tag = Reflect<Tag>.mapObject(data: data)
// convert json to object array
let tags = Reflect<Tag>.mapObjects(json: json)
// convert data to object array
let tags = Reflect<Tag>.mapObjects(data: data)

实例

具体见代码示例

字典转模型
指定需要转换的json或data,并指定转换的模型类型
let book = Reflect<Book>.mapObject(json: json)
let book = Reflect<Book>.mapObject(data: data)

Alt text

字典数组转模型数组
指定需要转换的json或data,并指定转换的模型数组内的元素类型
let casts = Reflect<Cast>.mapObjects(json: json)
let casts = Reflect<Cast>.mapObjects(data: data)

Alt text

=======

补充方法

补充方法皆遵守于协议,可代码提示

1.需要替换的属性名

希望将json的title属性对应到模型的tt属性

func setupMappingReplaceProperty() -> [String : String] {
    return ["tt": "title"]
}

2.模型内嵌套子类模型

需要指定子类模型的key以及子类的类名

func setupMappingObjectClass() -> [String : AnyClass] {
  return ["images": Images.self]
}

3.模型内嵌套子类模型数组

需要指定子类模型数组的key以及子类的类名

func setupMappingElementClass() -> [String : AnyClass] {
  return ["tags": Tag.self]
}

4.需要忽略属性

指定需要忽略的属性名

func setupMappingIgnorePropertyNames() -> [String] {
  return ["tags"]
}

完整模型演示

class TTNull: NSObject {

}

class Book: NSObject {
  var tt: String = ""
  var pubdate: String = ""
  var image: String = ""
  var binding: String = ""
  var pages = 0
  var alt: String = ""
  var id: String = ""
  var publisher: String = ""
  var summary: String = ""
  var price: String = ""
  var secretly: Bool = false
  var imgs = Images()
  var tags = [Tag]()
  var test_null = TTNull()

  func setupMappingReplaceProperty() -> [String : String] {
    return ["tt": "title", "imgs": "images"]
  }

  func setupMappingObjectClass() -> [String : AnyClass] {
    return ["images": Images.self, "test_null": TTNull.self]
  }

  func setupMappingElementClass() -> [String : AnyClass] {
    return ["tags": Tag.self]
  }
}

完整转换效果

Alt text

=======

帮助

1.如果在使用过程中遇到bug,或是有期待的功能,请留下Issues联系我,我将尽快答复

2.如果希望能够完善这个框架,敬请pull request

E-mail: tifatsubasa@163.com

About

Swift Json-Model automatic mapping Swift版JsonModel自动映射

Resources

License

Stars

Watchers

Forks

Packages

No packages published