2011-04-20 170 views
3

是否有任何通用的实现将任何对象转换为NSDictionary,将所有变量名称设置为键和值作为字典值?将对象转换为NSDictionary

+0

看到这个答案将对象转换为NSDictionary的 [转换物体插入的NSDictionary] [1] [1]:http://stackoverflow.com/a/12890495/600076 – iHS 2012-10-15 06:53:27

+1

这是最好的动态的方式,我发现http://stackoverflow.com/questions/ 10318366/obj-c-easy-method-to-convert-from-nsobject-with-properties-to-nsdictionary#10318659 – 2013-03-31 13:29:43

回答

3

使用SBJSONParser求解,将NSObject转换为JSON表示形式,然后将NSDictionary从中提取出来。

+0

你可以告诉我一个例子,我试图将一个NSobject转换为json,发现没有好的例子可以让你给我一个链接? – Radu 2011-07-27 12:43:34

+1

http://code.google.com/p/json-framework/source/browse/trunk/Source/NSObject%2BSBJSON.m?r=532 – 2011-07-28 04:13:11

+1

如果你使用JSONKit,你会做NSDictionary * deserializedData = [jsonString objectFromJSONString ]。 – loretoparisi 2012-07-14 00:29:57

0

不,你可以在你的课堂中拥有一切,例如对其他对象和原语的引用。 NS-Dictionary可以将自己序列化为NSString,NSString可以从字符串重新创建字典。最好将你提供你自己的方法来序列化它。

4

为了实现您的目标,您可以使用键值编码。此协议提供了一种机制,可根据以NSString表示的属性名称来设置对象属性的值,而不是直接调用访问器。

为了使其工作,您需要使用遵循命名约定的访问器定义对象(使用属性足够简单)。你可以看到的NSKeyValueCoding协议莅临指导:

http://bit.ly/es6kyH

和键 - 值编码编程指南这里:

http://bit.ly/fBY3Qa

你还要做迭代,但它是一个好的开始。

1

做到这一点的最佳方法是使用一个库序列化/反序列化 许多图书馆也有,但我喜欢的是 JagPropertyConverter https://github.com/jagill/JAGPropertyConverter

它可以将您的自定义对象转换为NSDictionary中,反之亦然

假设

@interface Person : NSObject 

@property (nonatomic, retain) NSNumber * age 
@property (nonatomic, retain) NSString * address 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSString * cellNo; 

@end 

JAGPropertyConverter *converter = [[JAGPropertyConverter alloc]init]; 
converter.classesToConvert = [NSSet setWithObjects:[Person class], nil]; 

Person *person = [[Person alloc]init]; 
person.name = @"name"; 
person.address = @"address"; 
person.age = @27; 
person.cellNo = @"XXXXXXXXXX"; 

//For Object to Dictionary 
NSDictionary *dictPerson = [converter convertToDictionary:person]; 


//For Dictionary to Object 
Person *person = [[Person alloc]init]; 
[converter setPropertiesOf:person fromDictionary:dictPerson];