Invalid top-level type in JSON write

 


*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'






  {

    NSString *urlStr = [NSStringstringWithFormat:@"%@%@",DEVELOP_CIRCUMENT,URL_MEDIA_UPLOAD_COMPLETE];

    NSString *jsonParam = [selfjsonFromDictionary:self.mediaPathdic];

    

    jsonParam = [jsonParamstringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    jsonParam = [jsonParamstringByReplacingOccurrencesOfString:@"\\/"withString:@"/"];

    

    [self.mediaPathdicsetObject:self.cerNoforKey:@"serno"];

    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManagermanager];

    sessionManager.requestSerializer = [AFJSONRequestSerializerserializer];

    [sessionManager.requestSerializersetValue:self.tokenforHTTPHeaderField:@"Mgr"];


    [sessionManager POST:urlStrparameters:jsonParam progress:nilsuccess:^(NSURLSessionDataTask *_Nonnull task, id _Nullable responseObject) {

        NSLog(@"responseObject = %@", responseObject[@"res_info"]);

    } failure:^(NSURLSessionDataTask *_Nullable task, NSError *_Nonnull error) {

        NSLog(@"uploadAllMediaComplete请求错误, %@", error);

    }];

}

其中jsonFromDictionary方法如下:

- (NSString *)jsonFromDictionary:(NSDictionary *)dic {

    if ([NSJSONSerializationisValidJSONObject:dic]) {

        NSError *error =nil;

        NSData *data = [NSJSONSerializationdataWithJSONObject:dic

                        

                                                       options:0

                        

                                                         error:&error];

        NSLog(@"error = %@", error);


        return [[NSStringalloc] initWithData:dataencoding:NSUTF8StringEncoding];

    }

    returnnil;

}


运行结果报错:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'





原因是:

sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];

这句代码告诉AFN,上传的数据格式是 JSON格式,AFN 内部会帮我进行JSON 的转码,但是我们自己又先进行了转码。

两次转码会导致上面的错误:


解决办法只需要改成下面就可以了,其中self.mediaPathdic 是字典。

    [sessionManager POST:urlStr parameters:self.mediaPathdic progress:nil success:^(NSURLSessionDataTask_Nonnull task, id  _Nullable responseObject) {

        NSLog(@"responseObject = %@", responseObject[@"res_info"]);

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        NSLog(@"uploadAllMediaComplete 请求错误, %@", error);

    }];









  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值