ESJsonFormat-Xcode + YYModel 实现嵌套类字典转模型

(一)ESJsonFormat是自动生成json属性的插件,其默认源是MJExtension。如果想要和YYModel嵌套使用,需要修改下源代码。

  默认MJExtension:

(1)在git上下载:https://github.com/EnjoySR/ESJsonFormat-Xcode

(2)打开代码源文件,在ESJsonFormatManager.m中搜索methodContentOfObjectClassInArrayWithClassInfo方法,搜索objectClassInArray替换为modelContainerPropertyGenericClass。

  (3)command + R 运行安装插件,完全退出Xcode后重启Xcode。

  (4)loadBundle,这样就可以识别YYModel实现自动转化了。

  那么我们看一下ESJsonFormat效果:

  • 将JSON格式化输出为模型的属性
  • 生成的MJExtension框架中obectClassInArray方法(返回字典对应的模型)-->经修改后的。

  功能说明:

  

-0.1

  • 通过JSON字符串生成对应属性
  • 通过文件写入的方式生成到.m文件
  • 支持输入嵌套模型名称

-0.2

  • 支持Swift
  • 修复JSON的value的值为Null的时候多出来的空行
  • 修复BOOL类型值格式化失效问题

-0.3

  • 支持生成MJExtension框架中objectClassInArray方法
  • 修复数组嵌套多级,里面子数组不能格式化的Bug

-0.4

  • 支持格式输出到文件
  • 支持格式输出泛型(Xcode 7及之后)

  #######################################################################################################

(二)YYModel:

  和MJEstension类似。但是YYModel作者测试的时候,声明YYModel的速度和容错率是最快的。

  特性:

  • 高性能: 模型转换性能接近手写解析代码。
  • 自动类型转换: 对象类型可以自动转换,详情见下方表格。
  • 类型安全: 转换过程中,所有的数据类型都会被检测一遍,以保证类型安全,避免崩溃问题。
  • 无侵入性: 模型无需继承自其他基类。
  • 轻量: 该框架只有 5 个文件 (包括.h文件)。
  • 文档和单元测试: 文档覆盖率100%, 代码覆盖率99.6%。

  注意:

  准备: 首先网络中后台接口返回的数据绝大多数都是json,我们先准备一个json数值格式如下

{
    "error": 0,
    "status": "success",
    "date": "2016-09-14",
    "results": [
        {
            "currentCity": "北京",
            "pm25": "123",
            "index": [
                {
                    "title": "穿衣",
                    "zs": "热",
                    "tipt": "穿衣指数",
                    "des": "天气热,建议着短裙、短裤、短薄外套、T恤等夏季服装。"
                },
                {
                    "title": "洗车",
                    "zs": "较适宜",
                    "tipt": "洗车指数",
                    "des": "较适宜洗车,未来一天无雨,风力较小,擦洗一新的汽车至少能保持一天。"
                },
                {
                    "title": "旅游",
                    "zs": "适宜",
                    "tipt": "旅游指数",
                    "des": "天气较好,但丝毫不会影响您的心情。微风,虽天气稍热,却仍适宜旅游,不要错过机会呦!"
                },
                {
                    "title": "感冒",
                    "zs": "少发",
                    "tipt": "感冒指数",
                    "des": "各项气象条件适宜,发生感冒机率较低。但请避免长期处于空调房间中,以防感冒。"
                },
                {
                    "title": "运动",
                    "zs": "较适宜",
                    "tipt": "运动指数",
                    "des": "天气较好,户外运动请注意防晒。推荐您进行室内运动。"
                },
                {
                    "title": "紫外线强度",
                    "zs": "中等",
                    "tipt": "紫外线强度指数",
                    "des": "属中等强度紫外线辐射天气,外出时建议涂擦SPF高于15、PA+的防晒护肤品,戴帽子、太阳镜。"
                }
            ],
            "weather_data": [
                {
                    "date": "周三 09月14日 (实时:29℃)",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/duoyun.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/qing.png",
                    "weather": "多云转晴",
                    "wind": "微风",
                    "temperature": "30 ~ 20℃"
                },
                {
                    "date": "周四",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/duoyun.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/duoyun.png",
                    "weather": "多云",
                    "wind": "微风",
                    "temperature": "30 ~ 21℃"
                },
                {
                    "date": "周五",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/yin.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/zhenyu.png",
                    "weather": "阴转阵雨",
                    "wind": "微风",
                    "temperature": "29 ~ 20℃"
                },
                {
                    "date": "周六",
                    "dayPictureUrl": "http://api.map.baidu.com/images/weather/day/yin.png",
                    "nightPictureUrl": "http://api.map.baidu.com/images/weather/night/zhenyu.png",
                    "weather": "阴转阵雨",
                    "wind": "微风",
                    "temperature": "25 ~ 19℃"
                }
            ]
        }
    ]
}

  下面我们利用ESJsonFormat自动解析并且用YYModel一句话实现字典(json)转模型。

  自动转化后的模型:

  .H:

  

#import <Foundation/Foundation.h>

@class JieGuo,Zhi,Weather_Data;
@interface Weather : NSObject

@property (nonatomic, copy) NSString *status;

@property (nonatomic, strong) NSArray<JieGuo *> *results;

@property (nonatomic, assign) NSInteger error;

@property (nonatomic, copy) NSString *date;

@end
@interface JieGuo : NSObject

@property (nonatomic, strong) NSArray<Weather_Data *> *weather_data;

@property (nonatomic, copy) NSString *currentCity;

@property (nonatomic, copy) NSString *pm25;

@property (nonatomic, strong) NSArray<Zhi *> *index;

@end

@interface Zhi : NSObject

@property (nonatomic, copy) NSString *title;

@property (nonatomic, copy) NSString *zs;

@property (nonatomic, copy) NSString *tipt;

@property (nonatomic, copy) NSString *des;

@end

@interface Weather_Data : NSObject

@property (nonatomic, copy) NSString *nightPictureUrl;

@property (nonatomic, copy) NSString *weather;

@property (nonatomic, copy) NSString *wind;

@property (nonatomic, copy) NSString *temperature;

@property (nonatomic, copy) NSString *dayPictureUrl;

@property (nonatomic, copy) NSString *date;

@end

  .M

#import "Weather.h"

@implementation Weather

+ (NSDictionary *)modelContainerPropertyGenericClass{
    return @{@"results" : [JieGuo class]};
}
@end
@implementation JieGuo

+ (NSDictionary *)modelContainerPropertyGenericClass{
    return @{@"index" : [Zhi class], @"weather_data" : [Weather_Data class]};
}

@end

@implementation Zhi

@end

@implementation Weather_Data

@end

  分析:已经在一个.h.m中自动完成了嵌套模型的赋值。

  modelContainerPropertyGenericClass方法是YYModel的,调用自动返回另一个嵌套模型。

  主页面代码:

  

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    Weather *model = [Weather yy_modelWithJSON:[self loadJson:@"Weather"]];

    NSString *data = model.results[0].weather_data[0].weather;

    NSLog(@"%@",data);

}

 - (NSDictionary *)loadJson:(NSString *)location {

     NSString *path = [[NSBundle mainBundle] pathForResource:location ofType:@"json"];

     NSData *jsonData = [NSData dataWithContentsOfFile:path];

     NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];

     return jsonDict;

 }
 

  打印效果:

  

  可见,字典转模型已经完毕了。已经拿到了全部数据的全部节点并且全部字典转模型。下面要做的只是UI层显示了。

时间: 2024-10-12 19:08:58

ESJsonFormat-Xcode + YYModel 实现嵌套类字典转模型的相关文章

福利-&gt;KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

C#嵌套类

嵌套类顾名思义就是类或者结构中定义的类 class Container { class Nested { Nested() { } } } <1>嵌套类的默认访问权限是private ,可以指定为public,protected,private,internal,protected internal.<2>嵌套类型可以访问外部类(包裹嵌套类的类),如果要访问外部类型,要把外部类通过构造函数传进一个实例<3>嵌套类中只能访问外部类中的静态成员,不能直接访问外部类的非静态成

C# 静态static 嵌套类 分部类

/*static的相关内容:静态字段,静态属性,静态方法,,静态构造,静态类,readonly,const,嵌套类,分部类 * static可以理解为全局的,共享同一块内存 * 可以通过default(类型名)得到每个类型的默认值 * 静态字段不从属于字段而是从属与类,而实例字段都是从属于每个字段,针对于每个字段都有不同的值 * 类和对象都能关联数据: * this是用于实例的访问方法,所以你能用this.静态成员进行访问 * 要想在静态方法中获得实例成员的访问,就必须先获得对字段或方法所从属于

C++ Primer 学习笔记_104_特殊工具与技术 --嵌套类

特殊工具与技术 --嵌套类 可以在另一个类内部(与后面所讲述的局部类不同,嵌套类是在类内部)定义一个类,这样的类是嵌套类,也称为嵌套类型.嵌套类最常用于定义执行类. 嵌套类是独立的类,基本上与它们的外围类不相关,因此,外围类和嵌套类的对象是互相独立的.嵌套类型的对象不具备外围类所定义的成员,同样,外围类的成员也不具备嵌套类所定义的成员. 嵌套类的名字在其外围类的作用域中可见,但在其他类作用域或定义外围类的作用域中不可见.嵌套类的名字将不会与另一作用域中声明的名字冲突 嵌套类可以具有与非嵌套类相同

快学Scala 第八课 (嵌套类)

嵌套类: class Human { class Student{ val age = 10 } } object ClassDemo { def main(args: Array[String]): Unit = { val h = new Human val s = new h.Student println(s.age) } } 有时会遇到这种情况: class Human { class Student { def addS(s: Student) = { val ab = new Ar

ZeroC ICE源代码中的那些事 - 嵌套类和局部类

使用嵌套类(类中定义的类,c++没有静态类)或局部类(在函数或成员方法中定义的类),进行行为模式的委托(委托请求)或异步 . java中嵌套类和局部类隐式完成了你对外部对象(实例)访问的私有堆栈的初始化,而c++你必须通过类成员变量来保存你要访问到的 外部对象(变量,实例),即自行实现私有堆栈,并使用嵌套类和局部类的构造函数,以参数传递的方式初始化这些用作私有堆栈的成 员变量.当你的局部类(在函数中定义的类)要访问到函数的局部变量时,你并不能确保局部类在局部变量被释放前访问,所以你只能 将局部变

c++嵌套类-内存分配

首先看下列代码:int main(){    double *p;    printf("sizeof(int):%d\nsizeof(double):%d\nsizeof(ptr):%d\n", sizeof(int), sizeof(double),sizeof(p)); getchar();    return 0;}结果为:我是在64位机器上运行的,可以看到,int类型分配4字节,double类型8字节,指针4字节./**********************/再看如下代码:

嵌套类 局部类

嵌套类 局部类 <c++ primer 3th> C++嵌套类 1.   嵌套类的名字只在外围类可见. 2.   类的私有成员只有类的成员和友元可以访问,因此外围类不可以访问嵌套类的私有成员.嵌套类可以访问外围类的成员(通过对象.指针或者引用). 3.   一个好的嵌套类设计:嵌套类应该设成私有.嵌套类的成员和方法可以设为 public . 4.   嵌套类可以直接访问外围类的静态成员.类型名( typedef ).枚举值. 嵌套类 一个类可以在另一个类中定义,这样的类被称为嵌套类.嵌套类是其

java进阶--嵌套类和接口

public class third { private int id1;//私有成员 public int id2; public static class class_top{ void sayid(third th){//静态嵌套类想要访问顶层类的私有/公有成员只能通过传递引用对象 th.id1=12; th.id2=12; } } public static class static_class extends class_top{ static void say_id(third th