Invalid type in JSON write (NSConcreteData)?

12,986

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 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.

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

Share:
12,986
karthikeyan
Author by

karthikeyan

Updated on July 22, 2022

Comments

  • karthikeyan
    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