JSONModel@thehtb 0.9.2

JSONModel@thehtb 0.9.2

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布最新发布2014年12月

Mark Aufflick 维护。



  • Marin Todorov 和 Mark Aufflick

高科技部门的 JSONModel 版权分支

在部门,我们喜欢 JSONModel 的声明性对象建模方法,但我们同样喜欢 Plist 文件对 NSDate 和 NSValue 等的本地支持。主要的 JSONModel 仓库名字缺少一些扩展选项,这些选项可以指定特定数据源支持比 JSON 更多的数据类型。此外,无关的是,它还缺少扩展序列化到其他类型的功能。

JSONModel 的作者 Marin Todorov 合理化地希望将根仓库集中在 JSON 上,因此我们开始维护这个分叉。这个分支与 JSONModel 0.9.1 版本功能相同,并提供了一些在头文件中记录的额外功能。README 已更新 :)。

JSON 魔法数据建模框架

JSONModel for iOS and OSX

JSONModel 是一个库,它允许快速创建智能数据模型。您可以在 iOS 或 OSX 应用于中用它。

JSONModel 自动检查模型类和您的 JSON 输入的结构,从而大大减少您需要编写的代码量。


将 JSONModel 添加到您的项目中

要求

  • 仅限 ARC;iOS 5.0+ / OSX 10.7+
  • SystemConfiguration.framework

获取方式:1) 源文件

  1. 下载 JSONModel 仓库作为 zip 文件 或克隆它
  2. 将 JSONModel 子文件夹复制到您的 Xcode 项目中
  3. 将您的应用程序链接到 SystemConfiguration.framework

或 2) 通过 Cocoa pods

在项目中 Podfile 添加 JSONModel pod

pod 'JSONModel'

如果您想了解更多关于 CocoaPods 的内容,请查看 这篇简短的教程

源代码文档

源代码包括类文档,您可以自己编译并将其导入到 Xcode 中

  1. 如果您还没有安装 appledoc,可以使用 homebrew 安装它,方法是键入 brew install appledoc
  2. 在存储库的根目录中,键入 appledoc . 安装文档。
  3. 如果 Xcode 已经运行,请重新启动。

基本用法

假设你有一个这样的JSON

{id:"10", "country":"Germany", "dialCode": 49, "isInEurope":true}
  • 为你数据模型创建一个新的Objective-C类,使其继承自JSONModel类。
  • 在你的头文件中声明属性,使用JSON键的名称
#import "JSONModel.h"

@interface CountryModel : JSONModel

@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* country;
@property (strong, nonatomic) NSString* dialCode;
@property (assign, nonatomic) BOOL isInEurope;

@end

.m文件中不需要做任何事情。

  • 用数据初始化你的模型
#import "CountryModel.h"
...

NSString* json = (fetch here JSON from Internet) ... 
NSError* err = nil;
CountryModel* country = [[CountryModel alloc] initWithString:json error:&err];

如果JSON的验证通过,你的模型中的所有对应属性都将从JSON中填充。JSONModel还会尝试将尽可能多的数据转换为预期的类型,在上面的例子中,它会

  • 将"id"从JSON中的字符串转换为你类的int类型
  • 只复制国家的值
  • 将dialCode从JSON中的数值转换为您类的NSString值
  • 最后将isInEurope转换为您的BOOL属性

好消息是,你所需要做的只是定义属性和它们预期的类型。


在线教程

官方网站:http://www.jsonmodel.com

在线类文档:http://jsonmodel.com/docs/

分步教程


示例

基于名称的自动映射

{
  "id": "123",
  "name": "Product name",
  "price": 12.95
}
@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;
@end

@implementation ProductModel
@end

模型级联(包括其他模型)

{
  "order_id": 104,
  "total_price": 13.45,
  "product" : {
    "id": "123",
    "name": "Product name",
    "price": 12.95
  }
}
@interface OrderModel : JSONModel
@property (assign, nonatomic) int order_id;
@property (assign, nonatomic) float total_price;
@property (strong, nonatomic) ProductModel* product;
@end

@implementation OrderModel
@end

模型集合

{
  "order_id": 104,
  "total_price": 103.45,
  "products" : [
    {
      "id": "123",
      "name": "Product #1",
      "price": 12.95
    },
    {
      "id": "137",
      "name": "Product #2",
      "price": 82.95
    }
  ]
}
@protocol ProductModel
@end

@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;
@end

@implementation ProductModel
@end

@interface OrderModel : JSONModel
@property (assign, nonatomic) int order_id;
@property (assign, nonatomic) float total_price;
@property (strong, nonatomic) NSArray<ProductModel>* products;
@end

@implementation OrderModel
@end

键映射

{
  "order_id": 104,
  "order_details" : [
    {
      "name": "Product#1",
      "price": {
        "usd": 12.95
      }
    }
  ]
}
@interface OrderModel : JSONModel
@property (assign, nonatomic) int id;
@property (assign, nonatomic) float price;
@property (strong, nonatomic) NSString* productName;
@end

@implementation OrderModel

+(JSONKeyMapper*)keyMapper
{
  return [[JSONKeyMapper alloc] initWithDictionary:@{
    @"order_id": @"id",
    @"order_details.name": @"productName",
    @"order_details.price.usd": @"price"
  }];
}

@end

全局键映射(应用于您的应用中的所有模型)

[JSONModel setGlobalKeyMapper:[
    [JSONKeyMapper alloc] initWithDictionary:@{
      @"item_id":@"ID",
      @"item.name": @"itemName"
   }]
];

自动映射下划线构成的单词到驼峰式

{
  "order_id": 104,
  "order_product" : @"Product#1",
  "order_price" : 12.95
}
@interface OrderModel : JSONModel

@property (assign, nonatomic) int orderId;
@property (assign, nonatomic) float orderPrice;
@property (strong, nonatomic) NSString* orderProduct;

@end

@implementation OrderModel

+(JSONKeyMapper*)keyMapper
{
  return [JSONKeyMapper mapperFromUnderscoreCaseToCamelCase];
}

@end

可选属性(即可能不存在或为null)

{
  "id": "123",
  "name": null,
  "price": 12.95
}
@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString<Optional>* name;
@property (assign, nonatomic) float price;
@property (strong, nonatomic) NSNumber<Optional>* uuid;
@end

@implementation ProductModel
@end

忽略的属性(即JSONModel完全忽略它们)

{
  "id": "123",
  "name": null
}
@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString<Ignore>* customProperty;
@end

@implementation ProductModel
@end

使所有模型属性可选(尽可能避免)

@implementation ProductModel
+(BOOL)propertyIsOptional:(NSString*)propertyName
{
  return YES;
}
@end

从字典到模型的懒加载转换集合项

{
  "order_id": 104,
  "total_price": 103.45,
  "products" : [
    {
      "id": "123",
      "name": "Product #1",
      "price": 12.95
    },
    {
      "id": "137",
      "name": "Product #2",
      "price": 82.95
    }
  ]
}
@protocol ProductModel
@end

@interface ProductModel : JSONModel
@property (assign, nonatomic) int id;
@property (strong, nonatomic) NSString* name;
@property (assign, nonatomic) float price;
@end

@implementation ProductModel
@end

@interface OrderModel : JSONModel
@property (assign, nonatomic) int order_id;
@property (assign, nonatomic) float total_price;
@property (strong, nonatomic) NSArray<ProductModel, ConvertOnDemand>* products;
@end

@implementation OrderModel
@end

使用内置的thin HTTP客户端

//add extra headers
[[JSONHTTPClient requestHeaders] setValue:@"MySecret" forKey:@"AuthorizationToken"];

//make post, get requests
[JSONHTTPClient postJSONFromURLWithString:@"http://mydomain.com/api"
                                   params:@{@"postParam1":@"value1"}
                               completion:^(id json, JSONModelError *err) {

                                   //check err, process json ...

                               }];

导出模型到NSDictionary或JSON文本

ProductModel* pm = [[ProductModel alloc] initWithString:jsonString error:nil];
pm.name = @"Changed Name";

//convert to dictionary
NSDictionary* dict = [pm toDictionary];

//convert to text
NSString* string = [pm toJSONString];
  • json验证
  • 数据转换
  • 错误处理
  • 自定义数据验证
  • 自动比较和相等性功能
  • 等等。

其他信息

作者:Marin Todorov

贡献者:Christian Hoffmann、Mark Joslin、Julien Vignali、Symvaro GmbH、BB9z。还有所有成功提交pull请求的人。

变更日志: https://github.com/icanzilb/JSONModel/blob/master/Changelog.md


授权

此代码根据MIT授权协议的条款和条件进行分发。


贡献指南

注意!如果您正在修复您发现的错误,请添加单元测试,以便我知道在合并前如何准确地重现错误。


Bitdeli Badge