DeSerializer 2.1.1

DeSerializer 2.1.1

测试测试
语言语言 SwiftSwift
许可证 Apache-2.0
发布最后发布2018年10月
SPM支持 SPM

Ilia Kosynkin 维护。



  • Ilia Kosynkin

DeSerializer

轻量级的自动 JSON 映射框架。

描述

自动 JSON 反序列化的框架。围绕 KlappaDeSerializer 包裹,具有更多 Swift 语法和更好的 Swift 功能支持。

安装

添加

    pod ‘DeSerializer’

到您的 Podfile 中。

然后运行

    pod install

    pod update

就可以开始了。

使用方法

简单情况

库提供了一个名为KLPDeserializer的静态方法类,强烈推荐使用它。让我们考虑以下JSON对象

{
    "name": "A green door",
    "price": 12.50
}

根据它进行类声明

class SimpleObject: Ancestor {
    var name: String!
    var price: NSDecimalNumber!
    
    override static func getRequiredFields() -> [Any]! {
        return ["name"]
    }
}

然后你可以使用以下方式反序列化它

let object: SimpleObject? = DeSerializer.deserialize(json: dict)

其中 'dict' 可以是字典或JSON字符串。

嵌套对象

反序列化器也允许你轻松地将嵌套对象的JSON对象进行反序列化。让我们考虑以下JSON对象

{
  "Title": "potato jpg",
  "Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan  jerawat  bintik hitam dan kemerahan pada kulit  Gunakan seminggu sekali sebagai",
  "Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
  "ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
  "RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
  "FileSize": 22630,
  "FileFormat": "jpeg",
  "Height": "362",
  "Width": "532",
  "Thumbnail": {
    "Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
    "Height": "98",
    "Width": "145"
  }
}

根据它进行类声明

class Thumbnail: Ancestor {
    var url: String!
    var height: String!
    var width: String!
}

class NestedObject: Ancestor {
    var title: String!
    var summary: String!
    var url: String!
    var clickUrl: String!
    var refererUrl: String!
    var fileSize: Int = 0
    var fileFormat: String!
    var height: String!
    var width: String!
    var thumbnail: Thumbnail?
}

可以按照与简单对象相同的方式进行反序列化

let object: NestedObject? = DeSerializer.deserialize(json: dict)

数组解析

反序列化器允许你以简单的方式反序列化具有数组字段的复杂对象。让我们看一下以下JSON

{
     "firstName": "John",
     "lastName": "Smith",
     "age": 25,
     "address":
     {
         "streetAddress": "21 2nd Street",
         "city": "New York",
         "state": "NY",
         "postalCode": "10021"
     },
     "phoneNumber":
     [
         {
           "type": "home",
           "number": "212 555-1234"
         },
         {
           "type": "fax",
           "number": "646 555-4567"
         }
     ]
 }

根据它进行类声明

class Address: Ancestor {
   var streetAddress: String!
   var city: String!
   var state: String!
   var postalCode: String!
}

class Phone: Ancestor {
   var type: String!
   var number: String!
}

class NestedObjectWithArray: Ancestor {
   var firstName: String!
   var lastName: String!
   var age: Int = 0
   var address: Address!
   var phoneNumber: [Phone] = []
}

可以按照与之前的例子完全相同的方式进行反序列化

let object: NestedObjectWithArray? = DeSerializer.deserialize(json: dict)

有时你不希望是对象,而是对象的数组。反序列化器允许你这样做。让我们考虑以下JSON样本

[
  {
    "Title": "potato jpg",
    "Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan  jerawat  bintik hitam dan kemerahan pada kulit  Gunakan seminggu sekali sebagai",
    "Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
    "ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
    "RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
    "FileSize": 22630,
    "FileFormat": "jpeg",
    "Height": "362",
    "Width": "532",
    "Thumbnail": {
      "Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
      "Height": "98",
      "Width": "145"
    }
  },
 {
 "Title": "potato jpg",
 "Summary": "Kentang Si bungsu dari keluarga Solanum tuberosum L ini ternyata memiliki khasiat untuk mengurangi kerutan  jerawat  bintik hitam dan kemerahan pada kulit  Gunakan seminggu sekali sebagai",
 "Url": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
 "ClickUrl": "http://www.mediaindonesia.com/spaw/uploads/images/potato.jpg",
 "RefererUrl": "http://www.mediaindonesia.com/mediaperempuan/index.php?ar_id=Nzkw",
 "FileSize": 22630,
 "FileFormat": "jpeg",
 "Height": "362",
 "Width": "532",
 "Thumbnail": {
 "Url": "http://thm-a01.yimg.com/nimage/557094559c18f16a",
 "Height": "98",
 "Width": "145"
 }
 }
]

根据类声明

class Thumbnail: Ancestor {
    var url: String!
    var height: String!
    var width: String!
}

class NestedObject: Ancestor {
    var title: String!
    var summary: String!
    var url: String!
    var clickUrl: String!
    var refererUrl: String!
    var fileSize: Int = 0
    var fileFormat: String!
    var height: String!
    var width: String!
    var thumbnail: Thumbnail?
}

正如你可能已经猜到的,反序列化非常简单

let objects: [NestedObject]? = DeSerializer.deserialize(json: array)

自定义字段映射

命名策略

命名策略 - 这是一个确定类中字段名称如何翻译成JSON中名称的类。KlappaDeSerializer提供了两种开箱即用的策略:KLPDefaultNamingStrategy和KLPExplicitNamingStrategy。显式命名策略是将类中字段一对一翻译。例如,如果您有一个名为"awesome_field"的字段,它将翻译成JSON中的"awesme_field"字段。默认命名策略将camelCase翻译成snake_case,即如果您类中有字段"awesomeField",则库将会在JSON中查找名为"awesome_field"的字段。目前不支持动态替换全局策略,它计划在下一个版本中添加。

类局部字段映射

有时您想要为单个或两个字段设置自定义映射,而不是全局映射,就像命名策略一样。在KlappaInjector中,您有两种实现方式 - 通过实现函数

func getCustomFieldsMapping() -> [AnyHashable : Any]!

或通过实现函数

func getNamingStrategy() -> KLPNamingStrategy?

在getCustomFieldsMapping函数中,您定义了一个字段如何被翻译成另一个字段。假设您类中有一个名为"url"的字段,在JSON中对应于"super_puper_awesome_url"。在这种情况下,您可以按以下方式实现函数

func getCustomFieldsMapping() -> [AnyHashable : Any]! {
    return ["url": "super_puper_awesome_url"];
}

然而,这将让您逐个翻译字段。如果您想要为类设置不同的命名策略(即,API中的一些实体由于某种原因具有不同的命名策略),则应实现getNamingStrategy。该函数应定义将类字段转换为特定类JSON字段的策略。

必备属性

在您的网络模型中,通常有一些字段对于应用程序运行是必要的,而且您不希望传递没有这些字段的实体。KlappaInjector允许您指定这样的必要字段。为此,您必须实现函数

func getRequiredFields() -> [Any]!

基本上,考虑一下,您模型类中有一个名为"id"的字段,并且您希望它始终存在。在这种情况下,您应该像以下方式实现这个函数

    override static func getRequiredFields() -> [Any]! {
        return ["name"]
    }

因此,在这种情况下,如果KlappaInjector遇到没有"id"的字段JSON - 它将返回nil,即使其他字段都在这里。

警告和限制

请注意,所有要将JSON反序列化的类都必须符合KLPDeserializable协议。请不要通过对NSObject进行扩展来符合此协议,而是从祖先那里继承您的类。

贡献

所有贡献和反馈都非常欢迎。如果您有任何关于 DeSerializer 工作方式的问题或疑问,您总是可以在问题部分提问或作为拉取请求提供修复。