我正在使用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
NSArrayorNSDictionary.All objects are instances of
Nsstring,NSNumber,NSArray,NSDictionary,orNSNull.All dictionary keys are instances of
Nsstring.Numbers are not
NaNor infinity.
如果要在JSON中包含NSData,则必须将其转换为字符串.常见的方法是对其进行base64编码(然后在目标中对base64字符串进行解码).