2017-03-15 10:03:01 u011312237 阅读数 493
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
    <dict>
        <key>name</key>
        <string>天天酷跑</string>
        <key>icon</key>
        <string>icon_00</string>
    </dict>
          <dict>
        <key>name</key>
        <string>保卫萝卜2</string>
        <key>icon</key>
        <string>icon_10</string>
    </dict>
    <dict>
        <key>name</key>
        <string>神偷奶爸</string>
        <key>icon</key>
        <string>icon_11</string>
    </dict>
</array>

</plist>


1.自定义的MyApp.h类,和字典中做到一一对应 
#import <Foundation/Foundation.h>
/**
 *  copy :NSString
    strong :一般对象
    weak:UI控件
    assign :基本数据类型
 */
@interface MyApp : NSObject
@property (nonatomic,copy) NSString *icon;
@property(nonatomic,copy) NSString *name;
/**
 *  通过字典来初始化模型对象
 *
 *  @param dic  字典对象
 *
 *  @return 已经初始化完毕的模型对象
 */
/*
instancetype的作用,就是使那些非关联返回类型的方法返回所在类的类型!
好处能够确定对象的类型,能够帮助编译器更好的为我们定位代码书写问题
instanchetype和id的对比
1、相同点
都可以作为方法的返回类型

2、不同点
①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象;

②instancetype只能作为返回值,不能像id那样作为参数,比如下面的写法:
*/
-(instancetype)initWithDict:(NSDictionary *)dict;

+(instancetype) appWithDict:(NSDictionary *)dict;
+(NSArray *)apps;
@end

2.MyApp.m类实现
@implementation MyApp
-(instancetype)initWithDict:(NSDictionary *)dict{
//第一种方式
    if (self=[super init]) {
        self.name=dict[@"name"];
        self.icon=dict[@"icon"];
    }
//第二种方式  常采用第二种方式
self=[super init];
if(self){
[self setValuesForKeysWithDictionary:dict];
}
    return self;
}
+(instancetype) appWithDict:(NSDictionary *)dict{
    
    // 为何使用self,谁调用self方法 self就会指向谁!!
    return [[self alloc] initWithDict:dict];
    
}


//处理plist数据 并返回模型对象的数组

+(NSArray *) apps{

if(_apps==nil){

//加载plist文件

NSString *path=[[NSBundle mainBundle] pathForResource:@"data.plist" ofType:nil];

//加载数组

NSArray *dicArray=[NSArray arrayWithContentsOfFile:path];

//上面两句话等同于

NSArray *dicArray=[NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"data.plist" ofType:nil]];

//将dicArray里面的所有字典转换成模型对象 放到新的数组里

NSMutableArray *mutableArray=[NSMutableArray array];

for(NSDictionary *dict in dicArray){}

 

[mutableArray addObject:[self appWithDict:dict ]];

}

return mutableArray;

}

@end


3.在其他的Viewcontroller.m文件调用的时候

第一步导入MyApp.h文件

@interface ViewController()

//第二步做个懒加载

@property(nonatomic,strong) NSArray *result;

@end

@implementation ViewController{


-(NSArray *)result{

if(_result==nil){

//类方法调用方式直接 类名+方法名

_result=[MyApp apps];

}


}

}

@end

2016-05-05 14:53:55 Haisens_ 阅读数 4902
/**
 *  对象转换为字典
 *
 *  @param obj 需要转化的对象
 *
 *  @return 转换后的字典
 */
+ (NSDictionary*)getObjectData:(id)obj {

    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    unsigned int propsCount;

    objc_property_t *props = class_copyPropertyList([obj class], &propsCount);

    for(int i = 0;i < propsCount; i++) {

        objc_property_t prop = props[i];
        NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];
        id value = [obj valueForKey:propName];
        if(value == nil) {

            value = [NSNull null];
        } else {
            value = [self getObjectInternal:value];
        }
        [dic setObject:value forKey:propName];
    }

    return dic;
}

+ (id)getObjectInternal:(id)obj {

    if([obj isKindOfClass:[NSString class]]
       ||
       [obj isKindOfClass:[NSNumber class]]
       ||
       [obj isKindOfClass:[NSNull class]]) {

        return obj;

    }
    if([obj isKindOfClass:[NSArray class]]) {

        NSArray *objarr = obj;
        NSMutableArray *arr = [NSMutableArray arrayWithCapacity:objarr.count];

        for(int i = 0; i < objarr.count; i++) {

            [arr setObject:[self getObjectInternal:[objarr objectAtIndex:i]] atIndexedSubscript:i];
        }
        return arr;
    }
    if([obj isKindOfClass:[NSDictionary class]]) {

        NSDictionary *objdic = obj;
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithCapacity:[objdic count]];

        for(NSString *key in objdic.allKeys) {

            [dic setObject:[self getObjectInternal:[objdic objectForKey:key]] forKey:key];
        }
        return dic;
    }
    return [self getObjectData:obj];

}

各位好,之前在开发过程中有这样的需求,从数据库拿到数据后以json的形式传给unity,但是数据库拿到的是对象,对象无法转换为json。所以需要先把对象转换成字典。 上述代码可实现对象与字典的转换。

2017-03-28 16:29:22 runtime233 阅读数 1045

sqlite只支持一些基本类型的存储(如TEXT,INTEGER,BLOB,REAL),但OC对象肯定无法直接通过存储sqlite中。
当然可以通过nskeyedarchiver进行归档,下面会介绍如何把OC对象存入sqlite的方法。话不多说:

一、把对象存入sqlite中
1、把对象转换成字典

id obj;
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
unsigned int propsCount;
objc_property_t *props = class_copyPropertyList([obj class], &propsCount);
for(int i = 0;i < propsCount; i++)
{
    objc_property_t prop = props[i];

    NSString *propName = [NSString stringWithUTF8String:property_getName(prop)];

    if ([propName hasSuffix:@"Url"]) {
        continue;
    }

    id value = [obj valueForKey:propName];
    if(value == nil)
    {
        value = [NSNull null];
    }
    else
    {
        value = [self getObjectInternal:value];
        [dic setObject:value forKey:propName];
    }
}
free(props);
return dic;

2、把字典转换成字符串存储

    NSError *error = nil;
    NSData *result = [NSJSONSerialization dataWithJSONObject:dic                                    options:kNilOptions error:&error];

    NSString *jsonString = [[NSString alloc] initWithData:result                              encoding:NSUTF8StringEncoding];

最后把字符串存储到sqlite中。

二、从sqlite中取出对象
1、取出转换成NSDictionary

NSString *str = [rs stringForColumn:@"***"]; 
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
__autoreleasing NSError* error = nil;

NSDictionary *dict = [NSJSONSerialization            JSONObjectWithData:data options:kNilOptions error:&error];

2、从NSDictionary转换为OC对象

id obj = [[[obj class] alloc] init];
if (dict) {
        for (NSString *key in [dict keyEnumerator]) {
            if([key isEqualToString:@"***"]){
                obj.*** = [[keyedValues objectForKey:@"***"] intValue];
            }else if([key isEqualToString:@"***"]){
                obj.*** = [[keyedValues objectForKey:@"***"] boolValue];
            }
        }
    }
2015-11-13 09:16:21 q617610589 阅读数 2297

//JSON to NSDictionary

- (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString {

  if (jsonString == nil) {

    return nil;

  }

  

  NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];

  NSError *err;

  NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData

                                                      options:NSJSONReadingMutableContainers

                                                        error:&err];

  if(err) {

    NSLog(@"json解析失败:%@",err);

    return nil;

  }

  return dic;

}


//NSDictionary to JSON string

- (NSString*)dictionaryToJson:(NSDictionary *)dic

{

  NSError *parseError = nil;

  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:&parseError];

  return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

}


2017-12-14 11:59:07 qq_14920635 阅读数 1369

为了将数据对象话,通常需要将网络请求的JSON数据或者字典转换为模型。

json数据一般有两种类型,第一种json字符串,需要解析出来,第二种json对象如:字典、数组   补充,网络传输一般使用的是jsonDate数据

一、不使用第三方库转换

1.字典转模型(定义模型类)

a.普通对应转换: 模型类.objectWithKeyValues(dic) as? 模型类

b.字典包裹模型数组时转换: 字典中包含数组时,模型类必须遵守DictModelProtocol 协议,并实现customClassMapping方法[作用指定数组中的元素类型]

class UserGroup: NSObject,DictModelProtocol {
    var groupName:String?;            //团队名称
    var numbers:NSArray?              //成员,又是一个模型类
    static func customClassMapping() -> [String: String]?{
        return ["numbers":"User"];   //指定numbers数组中的元素类型是User
    }
}

作者:hejunm

c.字典数组转换为模型数组  : 字典数组.objectArrayWithKeyValuesArray(arrayOfStatus)

详细参考:【字典模型互转--hejunm

2.模型转字典

a.普通 :  模型实例.keyValues 即可得到 如:let dic:Dictionary =  user.keyValues  //获得模型的字典模式

b.模型数组转字典:  模型数组.keyValusArray 如: let dic: Dictionary = userArr.keyValusArray

二、使用常用第三个库转换

常用数模转换库:yyModel   MJExtension  ObjectMapper(swift)

ObjectMapper使用   [git地址]

yyModel使用


objectMaper 使用简介

模型类遵循Mappable 

实现init?(map:Map)方法 可以下此方法中过滤一些脏数据(如,某个属性没有值,则返回nil)

required init?(map: Map){
	// check if a required "name" property exists within the JSON.
	if map.JSON["name"] == nil {
		return nil
	}
}

实现 mutating func mapping(map:Map)方法

 // Mappable
    func mapping(map: Map) {
        username    <- map["username"]
        age         <- map["age"]
        weight      <- map["weight"]
        array       <- map["arr"]
        dictionary  <- map["dict"]
        bestFriend  <- map["best_friend"]
        friends     <- map["friends"]
        birthday    <- (map["birthday"], DateTransform())
    }


提示,可以自定义转化类型,在mapping中使用

//自定义转换类型 需要的是自定义State enum类型, 后台传过来的是Int
        let stateTransformer = TransformOf<OrderState, Int>(fromJSON: { (value: Int?) -> OrderState? in
            return OrderState(rawValue: value ?? -1)//返回所需的类型【将后台的Int转换为OrderSate】  从json中的数据类型转换为模型所需类型
        }) { (state) -> Int? in
            return state?.rawValue  //存在着将对象转换为json的过程时调用。
        }


ios对象转换为字典

阅读数 465

没有更多推荐了,返回首页