ios – JSON写入中的类型无效(NSConcreteData)?

我正在使用AFNetworking发布带有一些数据的音频.我得到以下异常.
*** Terminating app due to uncaught exception 'NSinvalidargumentexception',reason: 'Invalid type in JSON write (NSConcreteData)'

我正在使用此代码..

dict=@{@"access_token":[defaults valueForKey:@"TOKEN"],@"email":email,@"prayer":passData};

if ([NSJSONSerialization isValidJSONObject:dict]) {
        NSLog(@"Proper JSON Object");

    }
    NSError *error;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];

    NSURL *URL = [NSURL URLWithString:url];
    NSMutableuRLRequest *request = [NSMutableuRLRequest requestWithURL:URL
                                                           cachePolicy:NSURLRequestReloadIgnoringCacheData  timeoutInterval:10];

    [request setHTTPMethod:@"POST"];
    [request setValue: @"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:jsonData];
 AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    op.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingallowFragments];
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation,id responSEObject) {}

我需要以这种格式发布值

{
    "access_token" = 2cf0d8a66654fa4f;
    email = "";
    prayer =     {
        audio = <63616666 00010000 64657363 00000000 00000020 40e58880 00000000 696d6134 00000000 00000044 00000040 00000002 00000000 6b756b69 00000000 00000000 66726565 0000000>
 98903013 31faae9c bb7b0780 80808080>;
        "category_id" = "";
        description = "";
        "expired_date" = "Expiration Date";
        "is_audio" = 1;
        "is_urgent" = 0;
        "prayer_access_id" = "";
        "prayer_type_id" = 1;
        subject = "";
    };
}

我不知道为什么会发生这种情况,我之前用这种格式发布了值,但是当我尝试将音频作为数据发布时,我得到了这个例外.
提前致谢

编辑

在这里制作数据

NSData *audioFile=[self audioData];
 if (audioFile==nil) {
        [passData setobject:@"" forKey:@"audio"];
        [passData setobject:@"0" forKey:@"is_audio"];

    }else{

        [passData setobject:audioFile forKey:@"audio"];
        [passData setobject:@"1" forKey:@"is_audio"];
    }


-(NSData *)audioData{
    NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(
                                                            NSDocumentDirectory,NSUserDomainMask,YES);
    Nsstring *docsDir = [dirPaths objectAtIndex:0];
    Nsstring *soundFilePath = [docsDir
                               stringByAppendingPathComponent:@"recordTest.caf"];

    NSURL *url = [NSURL fileURLWithPath:soundFilePath];
    NSData *audioData=[NSData dataWithContentsOfURL:url];
    return audioData;
}

这就是我插入音频文件

解决方法

问题是你不能把NSData放在JSON中.音频是NSData.正如NSJSONSerialization documentation所说:

An object that may be converted to JSON must have the following properties:

  • The top level object is an NSArray or NSDictionary.

  • All objects are instances of Nsstring,NSNumber,NSArray,NSDictionary,or NSNull.

  • All dictionary keys are instances of Nsstring.

  • Numbers are not NaN or infinity.

如果要在JSON中包含NSData,则必须将其转换为字符串.常见的方法是对其进行base64编码(然后在目标中对base64字符串进行解码).

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...