首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何将JSON转换为Object

如何将JSON转换为Object
EN

Stack Overflow用户
提问于 2011-11-27 14:56:17
回答 3查看 5.4K关注 0票数 10

我定义了一些自定义类,比如TeacherStudent……现在我从远程服务器接收教师信息(JSON字符串)。

如何将JSON字符串转换为Teacher对象。

在Java语言中,很容易为所有类(TeacherStudent……)实现一个公共方法。和reflect在一起。

但在iOS上的Objective-C中,我能找到的最好的方法是使用核心数据实体,它有setValue:forKey方法。首先,我将JSON字符串转换为NSDictionary,并将disctionary中的键值对设置为Entry

有没有更好的方法?

(我来自中国,所以可能我的英语不好,对不起!)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-27 16: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的回调

代码语言:javascript
代码运行次数:0
运行
复制
- (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);
}

显然,您可以重构它以使其更简洁,但这现在解决了我的所有问题。不用再解析了..。只需响应->魔术->对象

票数 5
EN

Stack Overflow用户

发布于 2011-11-27 15:03:38

首先,您是否使用JSON解析器?(如果没有,我建议使用SBJson)。

其次,为什么不在返回self对象的自定义类中创建一个initWithDictionary初始化方法呢?

票数 6
EN

Stack Overflow用户

发布于 2017-06-22 19:05:32

具体来说,请查看https://github.com/fanpyi/jsontooc/blob/master/README.md这是使用nodejs将JSON数据转换为Objective-C模型的示例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8284123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档