Invalid type in JSON write (NSConcreteData)?
Solution 1
The problem is that you cannot put NSData
in JSON. The audio
is NSData
. As the NSJSONSerialization
documentation says:
An object that may be converted to JSON must have the following properties:
The top level object is an
NSArray
orNSDictionary
.All objects are instances of
NSString
,NSNumber
,NSArray
,NSDictionary
, orNSNull
.All dictionary keys are instances of
NSString
.Numbers are not
NaN
or infinity.
If you want to include NSData
in JSON, you have to convert it to a string. The common way to do that is to base64 encode it (and then, in the destination, decode the base64 string).
Solution 2
You have a syntax error in your Json text. check it on http://www.jsoneditoronline.org and try again when you are sure if it is correct formed Json
karthikeyan
Updated on July 22, 2022Comments
-
karthikeyan almost 2 years
I am using AFNetworking to post an audio with some data. I am getting following exception.
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteData)'
I am using this code..
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) {}
I need to post values in this format
{ "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 = ""; }; }
I don't know why this is happening, I have posted values before with this format but when I try to post audio as data, I am getting this exception. Thanks in advance
Edit
Here i am making data
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; }
this what i am inserting audio file