反射--> 解析JSON数据
方法一
Persons.json文件
[
{
"name": "Chris",
"age": 18,
"city": "Shanghai",
"job": "iOS"
},
{
"name": "Ada",
"age": 16,
"city": "Beijing",
"job": "student"
},
{
"name": "Rita",
"age": 17,
"city": "Xiamen",
"job": "HR"
}
]
Model.h类
#import <Foundation/Foundation.h> @interface PersonModel : NSObject @property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *city;
@property (nonatomic, copy) NSString *job;
@property (nonatomic, copy) NSString *sex; - (instancetype)initWithNSDictionary:(NSDictionary *)dict; @end
Model.m类
#import "PersonModel.h"
#import <objc/runtime.h> @implementation PersonModel - (instancetype)initWithNSDictionary:(NSDictionary *)dict {
self = [super init];
if (self) {
[self prepareModel:dict];
}
return self;
} - (void)prepareModel:(NSDictionary *)dict {
NSMutableArray *keys = [[NSMutableArray alloc] init]; u_int count = ;
objc_property_t *properties = class_copyPropertyList([self class], &count);
for (int i = ; i < count; i++) {
objc_property_t property = properties[i];
const char *propertyCString = property_getName(property);
NSString *propertyName = [NSString stringWithCString:propertyCString encoding:NSUTF8StringEncoding];
[keys addObject:propertyName];
}
free(properties); for (NSString *key in keys) {
if ([dict valueForKey:key]) {
[self setValue:[dict valueForKey:key] forKey:key];
}
}
} @end
调用
NSString *file = [[NSBundle mainBundle] pathForResource:@"Persons" ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:file];
NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; for (NSDictionary *model in array) {
PersonModel *person = [[PersonModel alloc] initWithNSDictionary:model];
NSLog(@"%@, %ld, %@, %@", person.name, (long)person.age, person.city, person.job);
}
打印结果:

方法二
数据模型的父类是:JSONModel
JSONModel的子类是:JSONPerson, JSONStudent, JSONTeacther等;
JSONStudent.h中
@import JSONModel; @interface JSONStudent : JSONModel @property (nonatomic, copy) NSString * id;
@property (nonatomic, copy) NSString * name;
@property (nonatomic, copy) NSString * nickName;
@property (nonatomic, copy) NSString * phoneNumber; @end
注意:这是用OC来写的!
获取属性
func getAllProperties<T: JSONModel>(anyClass: T) -> [String] {
var properties = [String]()
let count = UnsafeMutablePointer<UInt32>.allocate(capacity: )
let buff = class_copyPropertyList(object_getClass(anyClass), count)
let countInt = Int(count[])
for i in ..<countInt {
let temp = buff![i]
let tempPro = property_getName(temp)
let proper = String(utf8String: tempPro!)
properties.append(proper!)
}
return properties
}
注意:获取属性使用Swift写的,单纯用Swift和OC要简单!
使用
func returnListStudent(students: [JSONStudent]) {
for item in students {
let studentProperties = self.getAllProperties(anyClass: item)
for i in ..< studentProperties.count{
print("值是:\(item.value(forKey: studentProperties[I]))" + "属性是:\(studentProperties[i])"self.dataError)
}
}
}
方法三
User.swift
import UIKit
class User: NSObject {
var name:String = "" //姓名
var nickname:String? //昵称
var age:Int? //年龄
var emails:[String]? //邮件地址
}
Mirror
属性
// 实例化
let user = User()
let mirror: Mirror = Mirror(reflecting:user) // subjectType:对象类型 print(mirror.subjectType) // 打印出:User // children:反射对象的属性集合 // displayStyle:反射对象展示类型 // advance 的使用
let children = mirror.children
let p0 = advance(children.startIndex, , children.endIndex) // name 的位置
let p0Mirror = Mirror(reflecting: children[p0].value) // name 的反射
print(p0Mirror.subjectType) //Optional<String> 这个就是name 的类型
调用:
@objc func testOne() {
// 得到应用名称
let nameSpace = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String
let clsName = "User"
// 使用NSClassFromString通过类名得到实例(得到类的完整路径, 注意分隔符是小数点;并判断数据类型是否符合预期。 备注: as?后面的格式是类名.Type, cls可能是nil)
guard let cls = NSClassFromString(nameSpace + "." + clsName) as? NSObject.Type else { return } //得到类完整路径
print("------_>\(cls)")
let user = cls.init()
print("------111111_>\(user)")
// 使用Mirror得到属性值
let mirror = Mirror(reflecting: user)
for case let(key?, value) in mirror.children {
print("key:\(key), value: \(value)") //打印成员属性
}
print(mirror.subjectType) //反射对象的数据类型</span>
}
打印:

反射--> 解析JSON数据的更多相关文章
- fastjson生成和解析json数据,序列化和反序列化数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- fastjson生成和解析json数据
本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...
- TypeToken 是google提供的一个解析Json数据的类库中一个类
Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Type是java里的reflect包的Type ...
- Android解析Json数据之Gson解析
Gson是谷歌官方提供的解析json数据的工具类.json数据的解析能够使用JSONObject和JSONArray配合使用解析数据,可是这样的原始的方法对于小数据的解析还是有作用的,可是陪到了复杂数 ...
- 使用Python解析JSON数据的基本方法
这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下: ----------------------------------- ...
- 使用jQuery解析JSON数据
我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- 用jquery解析JSON数据的方法以及字符串转换成json的3种方法
用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...
随机推荐
- JQuery is()与hasClass()方法的对比
is()和hasClass()方法都可以用以检查匹配的所有元素里是否含有指定类名,虽说hasClass(className)函数等价于is(“.className”) 但is()方法比hasClass ...
- Android SDK下载和更新失败的如何解决
一.scenario: 在部署Appium环境搭建时,安装SDK Manager.exe,遇到Android SDK下载更新失败. 报错信息如下图: Failed to fetch URL https ...
- 20181226 PL/SQL批量生产处理语句
总有那么些时候,对某些特定条件的数据需要做更新或者修改,或者Truncate特定的一些表,而你又不想要每一个表都去写Truncate table 语句. 那么可以采用Select 的拼接语句 如下: ...
- 火币网API文档——REST API 签名认证
安全认证 目前关于apikey申请和修改,请在“账户 - API管理”页面进行相关操作.其中AccessKey为API 访问密钥,SecretKey为用户对请求进行签名的密钥(仅申请时可见).Pro站 ...
- MySQL表操作及数据操作
表操作 表相当于一个文件,其形式与现实中的表格相同.表中的每条记录都有相应的字段,字段就类似于表格的表头. 表操作详细: #对表进行操作(文件) #首先要切换到指定库(即文件夹)下:use db1; ...
- ORACLE12C架构图
- 【SVM】周志华
一.书籍(121-139)
- Ajax 传包含集合的JSON
通过ajax给后台传json对象,当json中含对象集合时,如 $.ajax({ url : , type : "POST", dataType : "json" ...
- mybatis test条件判断 如何引用 传入的 list参数中的map中的值
<select id="query" resultType="map"> select * from ${tbName} <where> ...
- shell 脚本中如何添加多行注释
shell中有时会用到多行注释,一种时vim的快捷方式,我不太熟悉,一种是如下 :<<! ......! 使用: :<< !.......! 比如: :<< ! ...