我定义了一些自定义类,比如Teacher
、Student
……现在我从远程服务器接收教师信息(JSON字符串)。
如何将JSON字符串转换为Teacher
对象。
在Java语言中,很容易为所有类(Teacher
、Student
……)实现一个公共方法。和reflect
在一起。
但在iOS上的Objective-C中,我能找到的最好的方法是使用核心数据实体,它有setValue:forKey
方法。首先,我将JSON字符串转换为NSDictionary
,并将disctionary中的键值对设置为Entry
。
有没有更好的方法?
(我来自中国,所以可能我的英语不好,对不起!)
发布于 2011-11-27 08:03:19
这些都是很好的框架,可以将JSON解析为字典或其他原语,但是如果您希望避免做大量重复的工作,请查看http://restkit.org。具体地说,请查看https://github.com/RestKit/RestKit/blob/master/Docs/Object%20Mapping.md这是一个关于对象映射的示例,在该示例中,您为教师类定义了映射,并且json通过使用KVC自动转换为教师对象。如果您使用RestKit的网络调用,这个过程是完全透明和简单的,但是我已经准备好了我的网络调用,我需要的是将我的json响应文本转换为一个用户对象(在您的例子中是教师),并且我最终弄清楚了如何实现。如果这是你所需要的,请发表评论,我将与RestKit分享如何做到这一点。
注意:我将假设json是使用映射约定{"teacher": { "id" : 45, "name" : "Teacher McTeacher"}}
输出的。如果不是这样,而是像这样的{"id" : 45, "name" : "Teacher McTeacher"}
,那么不用担心……链接中的对象映射设计文档向您展示了如何做到这一点……一些额外的步骤,但也不算太差。
这是我来自ASIHTTPRequest的回调
- (void)requestFinished:(ASIHTTPRequest *)request {
id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:[request.responseHeaders valueForKey:@"Content-Type"]]; // i'm assuming your response Content-Type is application/json
NSError *error;
NSDictionary *parsedData = [parser objectFromString:apiResponse error:&error];
if (parsedData == nil) {
NSLog(@"ERROR parsing api response with RestKit...%@", error);
return;
}
[RKObjectMapping addDefaultDateFormatterForString:@"yyyy-MM-dd'T'HH:mm:ssZ" inTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; // This is handy in case you return dates with different formats that aren't understood by the date parser
RKObjectMappingProvider *provider = [RKObjectMappingProvider new];
// This is the error mapping provider that RestKit understands natively (I copied this verbatim from the RestKit internals ... so just go with it
// This also shows how to map without blocks
RKObjectMapping* errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping mapKeyPath:@"" toAttribute:@"errorMessage"];
[provider setMapping:errorMapping forKeyPath:@"error"];
[provider setMapping:errorMapping forKeyPath:@"errors"];
// This shows you how to map with blocks
RKObjectMapping *teacherMapping = [RKObjectMapping mappingForClass:[Teacher class] block:^(RKObjectMapping *mapping) {
[mapping mapKeyPath:@"id" toAttribute:@"objectId"];
[mapping mapKeyPath:@"name" toAttribute:@"name"];
}];
[provider setMapping:teacherMapping forKeyPath:@"teacher"];
RKObjectMapper *mapper = [RKObjectMapper mapperWithObject:parsedData mappingProvider:provider];
Teacher *teacher = nil;
RKObjectMappingResult *mappingResult = [mapper performMapping];
teacher = [mappingResult asObject];
NSLog(@"Teacher is %@ with id %lld and name %@", teacher, teacher.objectId, teacher.name);
}
显然,您可以重构它以使其更简洁,但这现在解决了我的所有问题。不用再解析了..。只需响应->魔术->对象
发布于 2011-11-27 07:03:38
首先,您是否使用JSON解析器?(如果没有,我建议使用SBJson)。
其次,为什么不在返回self对象的自定义类中创建一个initWithDictionary初始化方法呢?
发布于 2017-06-22 11:05:32
具体来说,请查看https://github.com/fanpyi/jsontooc/blob/master/README.md这是使用nodejs将JSON数据转换为Objective-C模型的示例。
https://stackoverflow.com/questions/8284123
复制