美文网首页
iOS面试问题:JSON转化中异常处理

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

作者: Jack小麻雀_ | 来源:发表于2023-03-01 11:26 被阅读0次

    最近被问到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");
        }
    

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/yywrldtx.html