[iOS]将含有NSData数据的数组转化为json字符串报错:reason: 'Invalid type in JSON write (NSConcreteMutableData)

最近在使用AFNetworking做一个上传图片的功能,后台提供的接口是一个post请求,因为在上传图片的同时,还要上传其他相关的附加信息,所以下面是后台提供的接口中一个key对应的value值:

[
 { 
    "imgstr": "21332112332112123",
         "sid": "1", "size": "h06", 
       "type": "1"
   },
   { 
        "imgstr": "1233113231213", 
             "sid": "2",
            "size": "h06", 
            "type": "0"
    }
]


 
  其中,imgstr就是包含图片信息的数据,外层的数组最后要转化为一个json字符串! 
  

我配置的参数是这样的:

 NSMutableArray *arr = [[NSMutableArray alloc]init];
    //生成四张测试图片
    for (int i = 0; i < 4; i++) {
        UIImage *img = [UIImage imageNamed:@"cut.jpg"];
        
        NSData *data = UIImagePNGRepresentation(img);

        NSDictionary *dic = @{@"imgstr":data,@"sid":@"2",@"size":@"h01",@"type":@"1"};

        [arr addObject:dic];
    }

    NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
    NSString *strs=[[NSString alloc] initWithData:data
                                         encoding:NSUTF8StringEncoding];

就在最后转化为json字符串的时候崩溃,提示如下错误:reason: 'Invalid type in JSON write (NSConcreteMutableData)

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteMutableData)'
无效的文件类型...

网上查了下,能够转换为json字符串的对象必须具有如下属性:

顶层对象必须是NSArray或者NSDictionary

所有的对象必须是NSString/NSNumber/NSArray/NSDictionary/NSNull的实例

所有NSDictionary的key必须是NSString类型

数字对象不能是非数值或无穷;

不是所有的都支持转化的,找到一个遇到同样问题的问答:http://www.4byte.cn/question/843610/adding-nsdata-into-nsdirectory-json-getting-invalid-type-in-json-write-nsconcretemutabledata-error.html

最后我的解决方案参考了第二种方法,只不过我是把生成的data数据用base64编码成字符串(确实后台也是需要这种base64编码后的字符串,但是木有说...),就可以正常转换了,最后,可行的代码如下:

NSMutableArray *arr = [[NSMutableArray alloc]init];
    //生成四张测试图片
    for (int i = 0; i < 4; i++) {
        UIImage *img = [UIImage imageNamed:@"cut.jpg"];
        
        NSData *data = UIImagePNGRepresentation(img);
        NSString *s = [data base64EncodedString];
        NSDictionary *dic = @{@"imgstr":s,@"sid":@"2",@"size":@"h01",@"type":@"1"};
        [arr addObject:dic];
    }
    NSData *data = [NSJSONSerialization dataWithJSONObject:arr options:NSJSONWritingPrettyPrinted error:nil];
    NSString *strs=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];


 
  希望能帮到遇到同样问题的人!!!

注意:本文只是为了解决这种错误,但是将图片放在请求参数中上传会有一些问题

经测试:上传小图片没问题,但是上传大点的图(测试图片1.7M),就不能上传成功...

后来查到原因是:苹果对post请求的文件大小有限制,一般在2m左右,或者更小,具体文件上传可参考文章:http://blog.csdn.net/xn4545945/article/details/37850065,所以,一般上传文件需要以文件流的形式,不应该把数据直接放在请求的参数中...


你可能感兴趣的:([iOS]将含有NSData数据的数组转化为json字符串报错:reason: 'Invalid type in JSON write (NSConcreteMutableData))