【问题标题】:Invalid type in JSON write (NSConcreteData)?JSON写入(NSConcreteData)中的类型无效?
【发布时间】:2015-11-16 07:01:50
【问题描述】:

我正在使用 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;
}

这是我插入的音频文件

【问题讨论】:

  • 显示 passData 初始化。
  • @Shoaib 感谢重播我已经在 viewdidload 方法中初始化 postData=[NSDictionary dictionary]; passData=[NSMutableDictionary 字典];
  • passData 字典中那个音频键的数据类型是什么?实际上,我想看看你在字典中插入了什么类型的数据。
  • @Shoaib 我是否需要任何 basecode64 格式的音频。我只是发送 NSData 而不是任何转换

标签: ios json afnetworking


【解决方案1】:

问题是您不能将 NSData 放入 JSON 中。 audioNSData。正如NSJSONSerialization documentation 所说:

可以转换为 JSON 的对象必须具有以下属性:

  • 顶级对象是NSArrayNSDictionary

  • 所有对象都是NSStringNSNumberNSArrayNSDictionaryNSNull 的实例。

  • 所有字典键都是NSString 的实例。

  • 数字不是NaN 或无穷大。

如果您想在 JSON 中包含 NSData,您必须将其转换为字符串。执行此操作的常用方法是对其进行 base64 编码(然后在目标中解码 base64 字符串)。

【讨论】:

【解决方案2】:

您的 Json 文本中有语法错误。在http://www.jsoneditoronline.org 上检查它,并在您确定它是否正确形成 Json 时重试

【讨论】:

  • 感谢您的评论,我对制作 json 格式没有问题,我认为在形成 json 时音频数据有问题,所以我需要对音频数据进行基本编码。感谢有用的链接
猜你喜欢
  • 1970-01-01
  • 2014-12-10
  • 2019-10-26
  • 2021-08-08
  • 2015-03-19
  • 2016-03-16
  • 2021-12-26
  • 2017-07-05
  • 2017-03-05
相关资源
最近更新 更多