JSON与MODEL互转

//
//  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
时间: 2024-10-14 23:15:09

JSON与MODEL互转的相关文章

JSON与String互转的实现方法(Javascript)_javascript技巧

JSON => String: jsonToString: function(obj){ var THIS = this; switch(typeof(obj)){ case 'string': return '"' + obj.replace(/(["\\])/g, '\\$1') + '"'; case 'array': return '[' + obj.map(THIS.jsonToString).join(',') + ']'; case 'object': i

HandyJSON:Swift语言JSON转Model工具库

背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发起网络请求,服务端返回JSON文本,然后客户端解析这个JSON文本,再把对应数据展现到页面上. 但在编程的时候,处理JSON是一件麻烦事.在不引入任何轮子的情况下,我们通常需要先把JSON转为Dictionary,然后还要记住每个数据对应的Key,用这个Key在Dictionary中取出对应的Value来使用.这个过程我们会犯各种错误: Key拼写错了; 路径写错了; 类型搞错了; 没拿到值懵逼了; 某一天和服

C#无需第三方插件实现json和table互转

C# 数据库查询结果table转化为json字符串,或反向把json字符串转换为DataTable数据集合 以下代码经实践简单可用. 转换通用类定义: using System; using System.Collections.Generic; using System.Collections; using System.Linq; using System.Web; using System.Web.Script.Serialization; using System.Data; using

java与javascript之间json格式数据互转介绍_javascript技巧

javascript中对象与字符串的互转 对象转为字符串:通过JSON.encode方法,这个是json.js里面的方法,引入到当前文件就可以了. 字符串转换为对象:①使用JSON.decode方法,同上,引入js就可以了.②jQuery中有个方法,$.parseJson也可以实现. java中json字符串与对象的互转 对象转换为字符串:在struts2-json-plugin.jar中有个JsonUtil.serial方法.也可以自己自由定制,通过字符串拼接的方式实现,json字符串的属性一

springMVC4(4)json与对象互转实例解析请求响应数据转换器

格式化数据输入输出 Spring3.0的重要接口:HttpMessageConveter为我们提供了强大的数据转换功能,将我们的请求数据转换为一个java对象,或将java对象转化为特定格式输出等.比如我们常见的从前端注册表单获取json数据并转化为User对象,或前端获取用户信息,后端输出User对象转换为json格式传输给前端等. spring 为我们提供了众多的HttpMessageConveter实现类,其中我们可能用得最多的三个实现类是: 实现类 功能 FormHttpMessageC

js中json字符串对象互转的例子

json对象,json字符串,不注意的话,很容易忽视混淆.例举几个容易混的情况 1,php将变量放到input框中,通过js去读取出来的是json字符串,要想使用就要将json字段串转成json对象 2,ajax返回json数据,如果请求没有设置dataType为json,这个时候得到也是json字符串 3,通过js改变input的value值,如果直接json对象,赋值的话,用开发者工具看到的值会是这样的,[Object Object] 一,json字符串,json对象区别 var aa =

php json与数组互转支持中文

 代码如下 复制代码 <?php /**  * json 生成,分析 支持中文  */ class Json_Helper {  /**   * 生成json   */  public static function encode($str){   $json = json_encode($str);   //linux         return preg_replace("#\u([0-9a-f]{4})#ie", "iconv('UCS-2BE', 'UTF-8

好东西

缓存好工具: JMCache 图片下载: DownloadOperation JSON与Model互转: JSONToModel 操作通讯录: THContactPicker JSON解析好工具: MJExtension 评价.版本更新.页面查看等: iLink 计算某段代码执行的时间: MKBlockTimer 为UIAlertView.UIActionSheet.UIControl的所有子类(UIButton,UIDataPicker 等等)添加使用 Block 的回调,代替delegate

Model 和 JSON 间互相转换

在.net 4.0 下可以使用:     // using System.Runtime.Serialization.Json;      <summary>     解析JSON,仿Javascript风格     </summary>    public static class JSON    {         public static T parse<T>(string jsonString)        {            using (var m