反射--> 解析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 ...
随机推荐
- 自动化测试:java + testng + maven + reportng + jenkins + selenium (一)_基于win环境
集成环境:jdk1.7 + tomcat1.7+ eclipse mars + maven + testng6.14.2 + selenium-java2.40.0 + reportng1.1.4 + ...
- Ansible 快速上手(转)
add by zhj: 执行Ansible(发音时,重音在最前面)命令有两种方式,一种是ad-hoc形式,另一种是playbooks,对于软件开发者来说,一般使用ad-hoc就足够了.playbook ...
- es中如何定位不合法搜索
GET /test_index/test_type/_validate/query?explain{ "query": { "math": { "te ...
- 如何处理浏览器缓存 加t
- python中的*arg和**kwargs
arg对应多出来的位置参数,把它们解析成tuple;kwargs把关键字参数解析成dict. def example(pram): print(pram) def example2(param, *a ...
- PHP 判断括号是否闭合
一开始的思路就是判断每种括号的开闭数量是否相等,其实虽然也能实现但是搞得太复杂了: 后来查了查,只需设一个常量,左括号 +1,右括号 -1,闭合的话为0,没闭合的话不为0, 出现<0即为顺 ...
- case关联表查询
select a.员工编号,b.`姓名`,b.`地址`,case when a.收入 is null then '没钱' when a.收入 < 2000 then '低收入'when a.收入 ...
- 项目发布脚本-nginx
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin clear printf &q ...
- [LeetCode] 586. Customer Placing the Largest Number of Orders_Easy tag;SQL
Query the customer_number from the orders table for the customer who has placed the largest number o ...
- [附POC]Apache Struts2最新(CVE-2017-5638,S02-45)POC
#! /usr/bin/env python # encoding:utf-8 import urllib2 import sys from poster.encode import multipar ...