JSON与MODEL互转
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json

·
//
// HYBJSONModel.h
// Json2ModelDemo
//
// Created by huangyibiao on 14-9-15.
// Copyright (c) 2014年 Home. All rights reserved.
//
#import <Foundation/Foundation.h>
/*!
* @brief JSON转换成Model,或者把Model转换成JSON
* @author huangyibiao
*/
@interface HYBJSONModel : NSObject
/*!
* @brief 把对象(Model)转换成字典
* @param model 模型对象
* @return 返回字典
*/
+ (NSDictionary *)dictionaryWithModel:(id)model;
/*!
* @brief 获取Model的所有属性名称
* @param model 模型对象
* @return 返回模型中的所有属性值
*/
+ (NSArray *)propertiesInModel:(id)model;
/*!
* @brief 把字典转换成模型,模型类名为className
* @param dict 字典对象
* @param className 类名
* @return 返回数据模型对象
*/
+ (id)modelWithDict:(NSDictionary *)dict className:(NSString *)className;
@end
//
// HYBJSONModel.m
// Json2ModelDemo
//
// Created by huangyibiao on 14-9-15.
// Copyright (c) 2014年 Home. All rights reserved.
//
#import "HYBJSONModel.h"
#import <objc/runtime.h>
typedef NS_ENUM(NSInteger, HYBJSONModelDataType) {
kHYBJSONModelDataTypeObject = 0,
kHYBJSONModelDataTypeBOOL = 1,
kHYBJSONModelDataTypeInteger = 2,
kHYBJSONModelDataTypeFloat = 3,
kHYBJSONModelDataTypeDouble = 4,
kHYBJSONModelDataTypeLong = 5,
};
@implementation HYBJSONModel
/*!
* @brief 把对象(Model)转换成字典
* @param model 模型对象
* @return 返回字典
*/
+ (NSDictionary *)dictionaryWithModel:(id)model {
if (model == nil) {
return nil;
}
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
// 获取类名/根据类名获取类对象
NSString *className = NSStringFromClass([model class]);
id classObject = objc_getClass([className UTF8String]);
// 获取所有属性
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList(classObject, &count);
// 遍历所有属性
for (int i = 0; i < count; i++) {
// 取得属性
objc_property_t property = properties[i];
// 取得属性名
NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
encoding:NSUTF8StringEncoding];
// 取得属性值
id propertyValue = nil;
id valueObject = [model valueForKey:propertyName];
if ([valueObject isKindOfClass:[NSDictionary class]]) {
propertyValue = [NSDictionary dictionaryWithDictionary:valueObject];
} else if ([valueObject isKindOfClass:[NSArray class]]) {
propertyValue = [NSArray arrayWithArray:valueObject];
} else {
propertyValue = [NSString stringWithFormat:@"%@", [model valueForKey:propertyName]];
}
[dict setObject:propertyValue forKey:propertyName];
}
return [dict copy];
}
/*!
* @brief 获取Model的所有属性名称
* @param model 模型对象
* @return 返回模型中的所有属性值
*/
+ (NSArray *)propertiesInModel:(id)model {
if (model == nil) {
return nil;
}
NSMutableArray *propertiesArray = [[NSMutableArray alloc] init];
NSString *className = NSStringFromClass([model class]);
id classObject = objc_getClass([className UTF8String]);
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList(classObject, &count);
for (int i = 0; i < count; i++) {
// 取得属性名
objc_property_t property = properties[i];
NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
encoding:NSUTF8StringEncoding];
[propertiesArray addObject:propertyName];
}
return [propertiesArray copy];
}
/*!
* @brief 把字典转换成模型,模型类名为className
* @param dict 字典对象
* @param className 类名
* @return 返回数据模型对象
*/
+ (id)modelWithDict:(NSDictionary *)dict className:(NSString *)className {
if (dict == nil || className == nil || className.length == 0) {
return nil;
}
id model = [[NSClassFromString(className) alloc]init];
// 取得类对象
id classObject = objc_getClass([className UTF8String]);
unsigned int count = 0;
objc_property_t *properties = class_copyPropertyList(classObject, &count);
Ivar *ivars = class_copyIvarList(classObject, nil);
for (int i = 0; i < count; i ++) {
// 取得成员名
NSString *memberName = [NSString stringWithUTF8String:ivar_getName(ivars[i])];
const char *type = ivar_getTypeEncoding(ivars[i]);
NSString *dataType = [NSString stringWithCString:type encoding:NSUTF8StringEncoding];
NSLog(@"Data %@ type: %@",memberName,dataType);
HYBJSONModelDataType rtype = kHYBJSONModelDataTypeObject;
if ([dataType hasPrefix:@"c"]) {
rtype = kHYBJSONModelDataTypeBOOL;// BOOL
} else if ([dataType hasPrefix:@"i"]) {
rtype = kHYBJSONModelDataTypeInteger;// int
} else if ([dataType hasPrefix:@"f"]) {
rtype = kHYBJSONModelDataTypeFloat;// float
} else if ([dataType hasPrefix:@"d"]) {
rtype = kHYBJSONModelDataTypeDouble; // double
} else if ([dataType hasPrefix:@"l"]) {
rtype = kHYBJSONModelDataTypeLong;// long
}
for (int j = 0; j < count; j++) {
objc_property_t property = properties[j];
NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property)
encoding:NSUTF8StringEncoding];
NSRange range = [memberName rangeOfString:propertyName];
if (range.location == NSNotFound) {
continue;
} else {
id propertyValue = [dict objectForKey:propertyName];
switch (rtype) {
case kHYBJSONModelDataTypeBOOL: {
BOOL temp = [[NSString stringWithFormat:@"%@", propertyValue] boolValue];
propertyValue = [NSNumber numberWithBool:temp];
}
break;
case kHYBJSONModelDataTypeInteger: {
int temp = [[NSString stringWithFormat:@"%@", propertyValue] intValue];
propertyValue = [NSNumber numberWithInt:temp];
}
break;
case kHYBJSONModelDataTypeFloat: {
float temp = [[NSString stringWithFormat:@"%@", propertyValue] floatValue];
propertyValue = [NSNumber numberWithFloat:temp];
}
break;
case kHYBJSONModelDataTypeDouble: {
double temp = [[NSString stringWithFormat:@"%@", propertyValue] doubleValue];
propertyValue = [NSNumber numberWithDouble:temp];
}
break;
case kHYBJSONModelDataTypeLong: {
long long temp = [[NSString stringWithFormat:@"%@",propertyValue] longLongValue];
propertyValue = [NSNumber numberWithLongLong:temp];
}
break;
default:
break;
}
[model setValue:propertyValue forKey:memberName];
break;
}
}
}
return model;
}
@end
json
适用于现代 C++ 的 JSON。
项目地址:https://gitcode.com/gh_mirrors/js/json
阅读全文
AI总结




适用于现代 C++ 的 JSON。
最近提交(Master分支:6 个月前 )
51a77f1d
3 小时前
756ca22e
3 小时前
更多推荐
相关推荐
查看更多
json

适用于现代 C++ 的 JSON。
json

An efficient JSON decoder
json

pretty-printed JSON response middleware
所有评论(0)