JSONCodable, 快速,免费的JSON编码和解码

分享于 

9分钟阅读

GitHub

  繁體
Hassle-free JSON encoding and decoding in Swift
  • 源代码名称:JSONCodable
  • 源代码网址:http://www.github.com/matthewcheok/JSONCodable
  • JSONCodable源代码文档
  • JSONCodable源代码下载
  • Git URL:
    git://www.github.com/matthewcheok/JSONCodable.git
    Git Clone代码到本地:
    git clone http://www.github.com/matthewcheok/JSONCodable
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/matthewcheok/JSONCodable
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    

    Logo

    PlatformLanguageCocoaPodsCarthageTravis CILicense

    快速的JSON编码和解码的#JSONCodable 麻烦

    安装

    • 只需将以下内容添加到你的Cartfile 并运行 carthage update:
    
    github"matthewcheok/JSONCodable" ~> 3.0.1
    
    
    
    
    • 或者将以下内容添加到 Podfile 并运行 pod install:
    
    pod 'JSONCodable', '~> 3.0.1'
    
    
    
    
    • 或者克隆成一个git子模块

    • 或者只是将 JSONCodable 文件夹中的文件复制到你的项目中。

    TLDR

    • 使用协议扩展
    • 错误处理
    • 支持 let 属性
    • 支持由兼容值支持的enum 属性

    更改日志

    • 将编码和解码方法移动到 helper 类

    JSONCodable 由两个独立的协议 JSONEncodableJSONDecodable 组成。

    • JSONEncodable 允许结构和类生成 NSDictionary 或者 [String: AnyObject] 等效,以便与 NSJSONSerialization 一起使用。

    • JSONDecodable 允许你从 NSDictionary 生成结构,这些结构来自一个网络请求,例如。

    ##Decoding JSON采用以下两种类型:

    structUser { 
     let id:Int 
     let name:String 
     var email:String? 
     var company: Company? 
     var friends: [User] = [] 
     } 
     structCompany { 
     let name:String 
     var address:String? 
     } 

    你只需添加与 JSONDecodable ( 或者 JSONCodable )的一致性:

    extensionUser: JSONDecodable {
     init(object: JSONObject) throws {
     let decoder =JSONDecoder(object: object) 
     id =try decoder.decode("id")
     name =try decoder.decode("full_name")
     email =try decoder.decode("email")
     company =try decoder.decode("company")
     friends =try decoder.decode("friends")
     }
    }extensionCompany: JSONDecodable {
     init(object: JSONObject) throws {
     let decoder =JSONDecoder(object: object)
     name =try decoder.decode("name")
     address =try decoder.decode("address")
     }
    }

    在类扩展上注意英镑: 在升级到Swift之后,不再支持在类的扩展中添加初始化器。 目前建议的解决方法是在类定义中添加初始化器。 对于结构扩展仍然可以像以前那样工作。

    然后提供 init(object: JSONObject) throws的实现,其中 JSONObject[String:AnyObject]的typealias。 以前一样,你可以使用这里方法配置字典中键之间的映射到结构和类中的属性。

    let user =tryUser(object: JSON)print("(user)")

    结果:

    User(
     id: 24,
     name: "John Appleseed",
     email: Optional("john@appleseed.com"),
     company: Optional(Company(
     name: "Apple",
     address: Optional("1 Infinite Loop, Cupertino, CA")
     )),
     friends: [
     User(
     id: 27,
     name: "Bob Jefferson",
     email: nil,
     company: nil,
     friends: []
     ),
     User(
     id: 29,
     name: "Jen Jackson",
     email: nil,
     company: nil,
     friends: []
     )
     ]
    )

    解码嵌套数组和字典

    解码还支持使用 . 分隔符和数组的[index] 来检索值。 请参见下面的示例:

    
    name = try decoder.decode("value[0].properties.name")
    
    
    
    

    编码 JSON

    简单地添加与 JSONEncodable ( 或者 JSONCodable )的一致性:

    extensionUser: JSONEncodable {
     functoJSON() throws->Any {
     returntry JSONEncoder.create({ (encoder) ->Voidintry encoder.encode(id, key: "id")
     try encoder.encode(name, key: "full_name")
     try encoder.encode(email, key: "email")
     try encoder.encode(company, key: "company")
     try encoder.encode(friends, key: "friends")
     })
     }
    }extensionCompany: JSONEncodable {}

    如果你需要其他映射,则 func toJSON()的默认实现使用反射( 查看 Company。) 检查类型的属性,你可以提供自己的实现( 请参见 User )。

    实例化你的结构,然后使用 func toJSON() 方法获取适合于 NSJSONSerialization 使用的等效形式:

    let dict =try user.toJSON()print("dict: (dict)")

    结果:

    [full_name: John Appleseed, id:24, email: john@appleseed.com, company: {
     address ="1 Infinite Loop, Cupertino, CA";
     name = Apple;
    }, friends: (
     {
     friends = (
     );
     "full_name"="Bob Jefferson";
     id =27;
     },
     {
     friends = (
     );
     "full_name"="Jen Jackson";
     id =29;
     }
    )]

    使用JSON字符串

    JSONDecodable 上提供了方便的初始化器 init?(JSONString: String)。 你也可以使用 func toJSONString() throws -> String 获取与你的类型等效的字符串。

    转换值

    要转换值,请创建 JSONTransformer的实例:

    let JSONTransformerStringToNSURL = JSONTransformer<String, NSURL>(
     decoding: {NSURL(string: $0)},
     encoding: {$0.absoluteString})

    在本例中,JSONTransformer 转换为 2类型,在本例中为 StringNSURL。 函数需要一个闭包,另一个用于编码,在每种情况下,返回对应输入类型( 如果不可能转换,则可以返回 nil )的对应类型的可选值。

    接下来,使用 func encode()func decode()的重载版本来提供变压器:

    structUser {
     ...var website: NSURL?}init(object: JSONObject) throws {
     ... website =try JSONDictionary.decode("website", transformer: JSONTransformerStringToNSURL)
    }functoJSON() throws->AnyObject {
     returntry JSONEncoder.create({ (encoder) ->Voidin...try result.encode(website, key: "website", transformer: JSONTransformerStringToNSURL)
     })
    }

    缺省情况下提供以下变压器:

    • JSONTransformers.StringToNSURL: String <-> NSURL
    • JSONTransformers.StringToNSDate: String <-> NSDate ISO格式

    请随意建议 !

    扩展 JSONCodable ( 感谢 @raylillywhite)

    这允许JSONDecoder扩展,使类型系统能够更好地帮助解码。 例如你可以执行以下操作:

    extensionJSONDecoder {
     publicfuncdecode(key: String) throws-> NSURL {
     returntrydecode(key, transformer: JSONTransformers.StringToNSURL)
     }
    }

    然后你只需执行以下操作:

    try url = decoder.decode("url")

    代替

    try url = decoder.decode("url", JSONTransformers.StringToNSURL)

    示例代码

    有关详细信息,请参阅工作区中包含的游乐场。

    许可证

    JSONCodable 在MIT许可证下。


    FREE  Swift  dec  
    相关文章