我有一个json对象:
@interface Order : NSObject
@property (nonatomic, retain) NSString *OrderId;
@property (nonatomic, retain) NSString *Title;
@property (nonatomic, retain) NSString *Weight;
- (NSMutableDictionary *)toNSDictionary;
...
- (NSMutableDictionary *)toNSDictionary
{
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setValue:self.OrderId forKey:@"OrderId"];
[dictionary setValue:self.Title forKey:@"Title"];
[dictionary setValue:self.Weight forKey:@"Weight"];
return dictionary;
}
在字符串中,这是:
{
"Title" : "test",
"Weight" : "32",
"OrderId" : "55"
}
我使用代码获取字符串JSON:
NSMutableDictionary* str = [o toNSDictionary];
NSError *writeError = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:str options:NSJSONWritingPrettyPrinted error:&writeError];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
现在我需要从JSON字符串创建和映射对象:
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *e;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&e];
这将返回我填写的NSDictionary。 我该怎么做才能从这本字典中获取对象?
答案 0 :(得分:22)
向initWithDictionary:
添加新的Order
方法:
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
if (self = [super init]) {
self.OrderId = dictionary[@"OrderId"];
self.Title = dictionary[@"Title"];
self.Weight = dictionary[@"Weight"];
}
return self;
}
不要忘记将initWithDictionary
的签名添加到Order.h
文件
在获得JSON的方法中:
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *e;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&e];
Order *order = [[Order alloc] initWithDictionary:dict];
答案 1 :(得分:11)
如果对象上的属性名称与JSON字符串中的键匹配,则可以执行以下操作:
要将JSON字符串映射到Object,您需要先将字符串转换为NSDictionary,然后使用NSObject上的方法,该方法使用键值编码来设置每个属性。
NSError *error = nil;
NSData *jsonData = ...; // e.g. [myJSONString dataUsingEncoding:NSUTF8Encoding];
NSDictionary *jsonDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingOptionsAllowFragments error:&error];
MyObject *object = [[MyObject alloc] init];
[object setValuesForKeysWithDictionary:jsonDictionary];
如果键不匹配,您可以覆盖对象类中NSObject -[NSObject valueForUndefinedKey:]
的实例方法。
要将Object映射到JSON,您可以使用Objective-C运行时自动执行此操作。以下适用于任何NSObject子类:
#import <objc/runtime.h>
- (NSDictionary *)dictionaryValue
{
NSMutableArray *propertyKeys = [NSMutableArray array];
Class currentClass = self.class;
while ([currentClass superclass]) { // avoid printing NSObject's attributes
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(currentClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
const char *propName = property_getName(property);
if (propName) {
NSString *propertyName = [NSString stringWithUTF8String:propName];
[propertyKeys addObject:propertyName];
}
}
free(properties);
currentClass = [currentClass superclass];
}
return [self dictionaryWithValuesForKeys:propertyKeys];
}
答案 2 :(得分:4)
假设您的属性名称和字典键相同,您可以使用此函数转换任何对象
- (void) setObject:(id) object ValuesFromDictionary:(NSDictionary *) dictionary
{
for (NSString *fieldName in dictionary) {
[object setValue:[dictionary objectForKey:fieldName] forKey:fieldName];
}
}
答案 3 :(得分:3)
这对您来说更方便:
- (instancetype)initWithDictionary:(NSDictionary*)dictionary {
if (self = [super init]) {
[self setValuesForKeysWithDictionary:dictionary];}
return self;
}
答案 4 :(得分:0)
执行此操作的最佳方法是使用库进行序列化/反序列化 有很多图书馆,但我喜欢的是 JagPropertyConverter https://github.com/jagill/JAGPropertyConverter
它可以将您的Custom对象转换为NSDictionary,反之亦然 甚至它支持转换字典或数组或对象中的任何自定义对象(即组合)
JAGPropertyConverter *converter = [[JAGPropertyConverter alloc]init];
converter.classesToConvert = [NSSet setWithObjects:[Order class], nil];
@interface Order : NSObject
@property (nonatomic, retain) NSString *OrderId;
@property (nonatomic, retain) NSString *Title;
@property (nonatomic, retain) NSString *Weight;
@end
//For Dictionary to Object (AS IN YOUR CASE)
NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
[dictionary setValue:self.OrderId forKey:@"OrderId"];
[dictionary setValue:self.Title forKey:@"Title"];
[dictionary setValue:self.Weight forKey:@"Weight"];
Order *order = [[Order alloc]init];
[converter setPropertiesOf:order fromDictionary:dictionary];
//For Object to Dictionary
Order *order = [[Order alloc]init];
order.OrderId = @"10";
order.Title = @"Title;
order.Weight = @"Weight";
NSDictionary *dictPerson = [converter convertToDictionary:person];
答案 5 :(得分:0)
定义自定义类继承自&#34; AutoBindObject&#34;。声明与NSDictionary中的键具有相同名称的属性。然后调用方法:
[customObject loadFromDictionary:dic];
实际上,我们可以自定义类以将不同的属性名称映射到字典中的键。除此之外,我们可以绑定嵌套对象
请看一下这个演示。用法很简单:
https://github.com/caohuuloc/AutoBindObject