# HandyJSON
HandyJSON is a framework written in Swift which to make converting model objects( **pure classes/structs** ) to and from JSON easy on iOS.
Compared with others, the most significant feature of HandyJSON is that it does not require the objects inherit from NSObject(**not using KVC but reflection**), neither implements a 'mapping' function(**writing value to memory directly to achieve property assignment**).
HandyJSON is totally depend on the memory layout rules infered from Swift runtime code. We are watching it and will follow every bit if it changes.
[](https://travis-ci.org/alibaba/HandyJSON)
[](https://github.com/Carthage/Carthage)
[](http://cocoadocs.org/docsets/HandyJSON)
[](http://cocoadocs.org/docsets/HandyJSON)
[](https://codecov.io/gh/alibaba/HandyJSON/branch/master)
## [中文文档](./README_cn.md)
## 交流群
群号: 581331250

## Sample Code
### Deserialization
```swift
class BasicTypes: HandyJSON {
var int: Int = 2
var doubleOptional: Double?
var stringImplicitlyUnwrapped: String!
required init() {}
}
let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
if let object = BasicTypes.deserialize(from: jsonString) {
print(object.int)
print(object.doubleOptional!)
print(object.stringImplicitlyUnwrapped)
}
```
### Serialization
```swift
let object = BasicTypes()
object.int = 1
object.doubleOptional = 1.1
object.stringImplicitlyUnwrapped = “hello"
print(object.toJSON()!) // serialize to dictionary
print(object.toJSONString()!) // serialize to JSON string
print(object.toJSONString(prettyPrint: true)!) // serialize to pretty JSON string
```
# Content
- [Features](#features)
- [Requirements](#requirements)
- [Installation](#installation)
- [Cocoapods](#cocoapods)
- [Carthage](#carthage)
- [Manually](#manually)
- [Deserialization](#deserialization)
- [The Basics](#the-basics)
- [Support Struct](#support-struct)
- [Support Enum Property](#support-enum-property)
- [Optional/ImplicitlyUnwrappedOptional/Collections/...](#optionalimplicitlyunwrappedoptionalcollections)
- [Designated Path](#designated-path)
- [Composition Object](#composition-object)
- [Inheritance Object](#inheritance-object)
- [JSON Array](#json-array)
- [Mapping From Dictionary](#mapping-from-dictionary)
- [Custom Mapping](#custom-mapping)
- [Date/Data/URL/Decimal/Color](#datedataurldecimalcolor)
- [Exclude Property](#exclude-property)
- [Update Existing Model](#update-existing-model)
- [Supported Property Type](#supported-property-type)
- [Serialization](#serialization)
- [The Basics](#the-basics)
- [Mapping And Excluding](#mapping-and-excluding)
- [FAQ](#faq)
- [To Do](#to-do)
# Features
* Serialize/Deserialize Object/JSON to/From JSON/Object
* Naturally use object property name for mapping, no need to specify a mapping relationship
* Support almost all types in Swift, including enum
* Support struct
* Custom transformations
* Type-Adaption, such as string json field maps to int property, int json field maps to string property
An overview of types supported can be found at file: [BasicTypes.swift](./HandyJSONTest/BasicTypes.swift)
# Requirements
* iOS 8.0+/OSX 10.9+/watchOS 2.0+/tvOS 9.0+
* Swift 3.0+ / Swift 4.0+ / Swift 5.0+
# Installation
**To use with Swift 5.0/5.1 ( Xcode 10.2+/11.0+ ), version == 5.0.1**
**To use with Swift 4.2 ( Xcode 10 ), version == 4.2.0**
**To use with Swift 4.0, version >= 4.1.1**
**To use with Swift 3.x, version >= 1.8.0**
For Legacy Swift2.x support, take a look at the [swift2 branch](https://github.com/alibaba/HandyJSON/tree/master_for_swift_2x).
## Cocoapods
Add the following line to your `Podfile`:
```
pod 'HandyJSON', '~> 5.0.1'
```
Then, run the following command:
```
$ pod install
```
## Carthage
You can add a dependency on `HandyJSON` by adding the following line to your `Cartfile`:
```
github "alibaba/HandyJSON" ~> 5.0.1
```
## Manually
You can integrate `HandyJSON` into your project manually by doing the following steps:
* Open up `Terminal`, `cd` into your top-level project directory, and add `HandyJSON` as a submodule:
```
git init && git submodule add https://github.com/alibaba/HandyJSON.git
```
* Open the new `HandyJSON` folder, drag the `HandyJSON.xcodeproj` into the `Project Navigator` of your project.
* Select your application project in the `Project Navigator`, open the `General` panel in the right window.
* Click on the `+` button under the `Embedded Binaries` section.
* You will see two different `HandyJSON.xcodeproj` folders each with four different versions of the HandyJSON.framework nested inside a Products folder.
> It does not matter which Products folder you choose from, but it does matter which HandyJSON.framework you choose.
* Select one of the four `HandyJSON.framework` which matches the platform your Application should run on.
* Congratulations!
# Deserialization
## The Basics
To support deserialization from JSON, a class/struct need to conform to 'HandyJSON' protocol. It's truly protocol, not some class inherited from NSObject.
To conform to 'HandyJSON', a class need to implement an empty initializer.
```swift
class BasicTypes: HandyJSON {
var int: Int = 2
var doubleOptional: Double?
var stringImplicitlyUnwrapped: String!
required init() {}
}
let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
if let object = BasicTypes.deserialize(from: jsonString) {
// …
}
```
## Support Struct
For struct, since the compiler provide a default empty initializer, we use it for free.
```swift
struct BasicTypes: HandyJSON {
var int: Int = 2
var doubleOptional: Double?
var stringImplicitlyUnwrapped: String!
}
let jsonString = "{\"doubleOptional\":1.1,\"stringImplicitlyUnwrapped\":\"hello\",\"int\":1}"
if let object = BasicTypes.deserialize(from: jsonString) {
// …
}
```
But also notice that, if you have a designated initializer to override the default one in the struct, you should explicitly declare an empty one(no `required` modifier need).
## Support Enum Property
To be convertable, An `enum` must conform to `HandyJSONEnum` protocol. Nothing special need to do now.
```swift
enum AnimalType: String, HandyJSONEnum {
case Cat = "cat"
case Dog = "dog"
case Bird = "bird"
}
struct Animal: HandyJSON {
var name: String?
var type: AnimalType?
}
let jsonString = "{\"type\":\"cat\",\"name\":\"Tom\"}"
if let animal = Animal.deserialize(from: jsonString) {
print(animal.type?.rawValue)
}
```
## Optional/ImplicitlyUnwrappedOptional/Collections/...
'HandyJSON' support classes/structs composed of `optional`, `implicitlyUnwrappedOptional`, `array`, `dictionary`, `objective-c base type`, `nested type` etc. properties.
```swift
class BasicTypes: HandyJSON {
var bool: Bool = true
var intOptional: Int?
var doubleImplicitlyUnwrapped: Double!
var anyObjectOptional: Any?
var arrayInt: Array<Int> = []
var arrayStringOptional: Array<String>?
var setInt: Set<Int>?
var dictAnyObject: Dictionary<String, Any> = [:]
var nsNumber = 2
var nsString: NSString?
required init() {}
}
let object = BasicTypes()
object.intOptional = 1
object.doubleImplicitlyUnwrapped = 1.1
object.anyObjectOptional = "StringValue"
object.arrayInt = [1, 2]
object.arrayStringOptional = ["a", "b"]
object.setInt = [1, 2]
object.dictAnyObject = ["key1": 1, "key2": "stringValue
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论







收起资源包目录





































































































共 546 条
- 1
- 2
- 3
- 4
- 5
- 6
资源评论


Aftery的博客
- 粉丝: 178
- 资源: 14
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
