Skip to content
John Lui edited this page Oct 13, 2017 · 13 revisions

示例

创建一个 Model:

class People: JSONNDModel {
    @objc var name = ""
}

从字符串转换成 JSON 再自动映射为 Model:

let data = "{\"name\": \"JohnLui\"}".dataUsingEncoding(NSUTF8StringEncoding)
let json = JSONND.initWithData(data!)
let people = People(JSONNDObject: json)
print(people.name) // get "JohnLui"

功能

自动映射

  • JSON 到 Model 自动映射
  • 无需 init()
  • 支持多层映射

JSON 编码 / 解码

  • 支持所有数据类型: Int, Double, Bool, String, Array
  • 用户体验良好:Xcode 会自动提示所有可选类型
  • 同时支持普通类型(Int)和可选类型(Int?)

测试覆盖率接近 100%。

环境要求

  • iOS 7.0+
  • Xcode 7

用法

引入

import JSONNeverDie

基础用法

从网路获得字符串,转化为 JSON:

let data = NSData(contentsOfURL: NSURL(string: "http://httpbin.org/get?hello=world")!)!
let json = JSONND.initWithData(data)
print(json["args"]["hello"].stringValue)

创建一个自动映射 Model

// 从 NSData 初始化
let data = NSData(contentsOfURL: NSURL(string: "http://httpbin.org/get?hello=world")!)!
let json = JSONND.initWithData(data)

// 从 Array 初始化
let arrayJSON = JSONND(array: ["hello", "world", 100])

// 从 Dictionary 初始化
let dictionaryJSON = JSONND(dictionary: ["hello": "world", "hey": "guys"])

获取值

let value = json["key"].int
let value = json["key"].intValue
let value = json["key"].string
let value = json["key"].stringValue
let value = json["key"].double
let value = json["key"].doubleValue
let value = json["key"].bool
let value = json["key"].boolValue
let value = json["key"].array
let value = json["key"].arrayValue

// 多层直接获取
let value = json["key"]["key1"]["key2"].int

处理 JSON 数组

if let jsonArray = json["array"].array {
    for jsonItem in jsonArray {
        let value = jsonItem["key"].int
    }
}

// 或者可以做的更简单
let value = json["array"].arrayValue[0]["key"].int

Xcode 可以自动提示所有可选类型

pic

从 JSONND 对象得到 JSON 字符串

let string = json.RAW

自定义 mapping

class Good : JSONNDModel {
    var des = ""
    required init(JSONNDObject json: JSONND) {
        super.init(JSONNDObject: json)
        self.des = json["description"].stringValue
    }
}

自动映射文档

继承自 JSONNDModel 的类的每一个成员变量都需要初始化。

class People: JSONNDModel {
    @objc var name = ""
    @objc var number = 0
    @objc var array = [Int]()
}

多层影射需要在上层的 init() 方法中初始化下层类:

class TestModel: JSONNDModel {
    @objc var string = ""
    @objc var double = 0.0
    @objc var int = 0
    @objc var array_values = [Int]()
    @objc var array = [ModelOnlyOneKey]()
    @objc var hey: Hey!
    required init(JSONNDObject json: JSONND) {
        super.init(JSONNDObject: json)
        
        for i in json["array_values"].arrayValue {
            self.array_values.append(i.intValue)
        }
        for i in json["array"].arrayValue {
            self.array.append(ModelOnlyOneKey(JSONNDObject: i))
        }
        self.hey = Hey(JSONNDObject: json["hey"])
    }
}
class ModelOnlyOneKey: JSONNDModel {
    @objc var key = 0
}
class Hey: JSONNDModel {
    @objc var man: Man!
    required init(JSONNDObject json: JSONND) {
        super.init(JSONNDObject: json)
        
        self.man = Man(JSONNDObject: json["man"])
    }
}
class Man: JSONNDModel {
    @objc var hello = false
}