iOS面试问题:JSON转化中异常处理

最近被问到iOS中JSON转Object的过程中如果服务端给的JSON是不全的该如何处理,会不会造成崩溃?
经过我的测试,是不会造成崩溃的,只是结果为nil,但是在object --> JSON的过程中发生错误的话,系统是会抛出异常,也就是崩溃的。下面可以仔细看一下iOS提供的API。

JSON --> Object

    BOOL isFool = YES;
    NSString *json = @"{\"users\":[\"Jack\",\"Pinkman\"]}";
    if (isFool) {
        json = @"{\":[\"Jack\",\"Pinkman\"]}";
    }
    // json --> dict
    NSData *j_data = [json dataUsingEncoding:NSUTF8StringEncoding];
    NSError *j_err = nil;
    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:j_data options:NSJSONReadingMutableContainers error:&j_err];
    if (dict && !j_err) {
        NSLog(@"success %@",dict);
    } else {
        /*
         json --> dict的过程中产生错误并不会崩溃
         */
        NSLog(@"fail %@",j_err);
    }

转换关键的是[NSJSONSerialization JSONObjectWithData:options:error:],看一下Apple给的注释

Create a Foundation object from JSON data. If an error occurs during the parse, then the error parameter will be set and the result will be nil.
--翻译--
根据JSON data创建一个Foundation Object。如果在转化的过程中发生了错误,结果为nil,error将会被赋值。
(省略掉了一些关于options参数的解释,整个注释中并没有提到会抛出异常)

所以结论是即使后端返回的JSON数据是异常的,iOS客户端在转化的过程中并不会崩溃,也无需做特殊处理。

Object --> JSON

先看Apple提供API的注释

Generate JSON data from a Foundation object. If the object will not produce valid JSON then an exception will be thrown.  If an error occurs, the error parameter will be set and the return value will be nil. 
--翻译--
根据一个Foundation object生成JSON data。如果object不是符合规范的JSON,异常将会被抛出。如果发生了异常,结果为nil,error会被赋值。
(Apple提示了这个过程中如果发生错误是会抛出异常崩溃的)

那么该如何规避这种崩溃呢?NSJSONSerialization中提供了+(BOOL)isValidJSONObject:用来检测object是否能被转成JSON,只要先用这个判断就可以了,代码如下:

    // 一个自定义的类,自己写一下就行
    BreakingBad *white = [[BreakingBad alloc] init];
    white.name = @"White";
    NSDictionary *origDict = @{
        @"users":@[@"Jessy",@"Pinkman"],
        @"guity":[NSNull null],
        @"object":white,
    };
    BOOL isValid = [NSJSONSerialization isValidJSONObject:origDict];
    if (isValid) {
        NSError *o_err = nil;
        NSData *o_data = [NSJSONSerialization dataWithJSONObject:origDict options:NSJSONWritingFragmentsAllowed error:&o_err];
        if (o_data && !o_err) {
            NSString *str = [[NSString alloc] initWithData:o_data encoding:NSUTF8StringEncoding];
            NSLog(@"obj --> json success %@",str);
        } else {
            NSLog(@"obj --> json fail %@",o_err);
        }
    } else {
        NSLog(@"obj --> json fail, obj is not valid");
    }
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.请简单说明多线程技术的优点和缺点? 优点:能够适当提高程序的执行效率;能够适当的提高资源的利用率,比如CPU、...
    deeper_iOS阅读 1,592评论 1赞 12
  • 发现自己有很多文档,所以现在整理一下,以防忘了。。。 作为一种轻量级的数据交换格式,json正在逐步取代xml,成...
    泺莫繁华阅读 1,641评论 0赞 1
  • 1.请简单说明多线程技术的优点和缺点? 优点:1.能够适当提高程序的执行效率;2.能够适当的提高资源的利用率,比如...
    Jorunk阅读 499评论 0赞 0
  • 未完,待更新 一、必备题 1、AFN 原理 链接:AFNetworking源码——基本架构 - 简书 2、SDWe...
    小熊_07cb阅读 3,060评论 3赞 27
  • JSON JSON和XML都是需要解析的 JSON是一种轻量级的数据格式,一般用于数据交互服务器返回给客户端的数据...
    JonesCxy阅读 2,067评论 2赞 10

友情链接更多精彩内容