2015-08-22 37 views
6

Bazı verilerle ses göndermek için AFNetworking kullanıyorum. İstisnaları takip ediyorum. Bu kodu kullanıyorumJSON write (NSConcreteData) içinde geçersiz tür?

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (NSConcreteData)' 

..

[email protected]{@"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) {} 

Ben

{ 
    "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 = ""; 
    }; 
} 

Bunu ben gönderdiniz değerleri neden oluyor bilmiyorum bu biçimde değerleri göndermek gerekir Bu formatla önce ama ses verilerini veri olarak göndermeye çalıştığımda, bu istisnayı alıyorum. peşin

Düzenleme İşte

yılında Teşekkür i verileri

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; 
} 

yapıyorum Eğer Json metninde bir sözdizimi hatası var ne ben ses dosyası

+0

bu passData başlatma işlemini gösterir. – Shoaib

+0

@Shoaib Tekrar gösterim için teşekkürler ViewDidload yönteminde initlized var postData = [NSDictionary dictionary]; passData = [NSMutableDictionary dictionary]; – karthikeyan

+0

passData sözlüğündeki ses anahtarının veri türü nedir? Aslında, sözlüğünüze hangi veri türlerini eklediğinizi görmek istiyorum. – Shoaib

cevap

17

Sorun şu ki, NSData JSON'a koyamazsınız. audio, NSData. NSJSONSerializationdocumentation söylediği gibi:

aşağıdaki özelliklere sahip olmalıdır JSON dönüştürülebilir bir nesne:

  • üst düzey nesne NSArray veya NSDictionary bir olduğunu.

  • tüm nesneler NSString, NSNumber, NSArray, NSDictionary veya NSNull örnekleridir.

  • Tüm sözlük tuşları, NSString örneklerinden oluşur.

  • Numaralar NaN veya sonsuz değil.

Eğer JSON NSData eklemek istiyorsanız

, bir dizeye dönüştürmek zorundayız. Bunu yapmanın ortak yolu, kodun 64 kodlanmasıdır (ve sonra hedefte, base64 dizesinin kodunu çözer).

+0

FWIW, Swift'in ['JSONEncoder'] (https: //developer.apple.com/documentation/foundation/jsonencoder) bir ['dataEncodingStrategy'] (https://developer.apple.com/documentation/foundation/jsonencoder/2895381-dataencodingstrategy) ve varsayılan olarak' .base64' için izin verir. – Rob

0

ekleme olduğum bu. http://www.jsoneditoronline.org üzerinde kontrol edin ve doğru biçimlendirilmiş olup olmadığından emin olduğunuzda yeniden deneyin. Json

+0

Yorum için teşekkürler, json formatı yaparken sorun değil, json oluştururken ses verileri ile sorun olduğunu düşünüyorum, bu yüzden yararlı bağlantı – karthikeyan

İlgili konular