You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C开发遇NSInvalidArgumentException JSON写入无效类型错误求助

问题根因
  • 该异常是AFNetworking组件在将请求参数序列化为JSON格式时抛出的,错误提示明确说明参数中存在NSError类型的对象,该类型不属于合法的JSON可序列化类型,因此触发崩溃。
  • 你调用[MTLJSONAdapter JSONArrayFromModels:events error:NULL]时直接给error参数传了NULL,忽略了模型转JSON的错误返回:当events数组中存在不符合JSON转换规则的模型时,转换过程产生的NSError对象会被混入返回的params数组,或是转换完全失败后你依然把非法返回值作为请求参数传入了POST方法,最终导致序列化失败。
解决方案
  1. 补全模型转JSON的错误处理,不要忽略转换阶段的错误,转换失败时直接走错误回调,不要发起无效请求
NSError *convertError = nil;
NSArray *params = [MTLJSONAdapter JSONArrayFromModels:events error:&convertError];
// 转换失败直接返回错误
if (convertError || !params) {
    completion(convertError ?: [NSError errorWithDomain:@"C8Analytics" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"事件数据转换失败"}]);
    return;
}
  1. 额外增加参数合法性校验,过滤掉非JSON兼容类型的对象,作为兜底保护
NSPredicate *validCheckPredicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bindings) {
    return [obj isKindOfClass:[NSDictionary class]] || [obj isKindOfClass:[NSString class]] || 
           [obj isKindOfClass:[NSNumber class]] || [obj isKindOfClass:[NSNull class]] || 
           [obj isKindOfClass:[NSArray class]];
}];
NSArray *validParams = [params filteredArrayUsingPredicate:validCheckPredicate];
if (validParams.count != params.count) {
    NSLog(@"检测到%ld个非法类型参数已被过滤", params.count - validParams.count);
}
  1. 排查events数组的数据源生成逻辑,确认是否有NSError对象被误加入到events数组中。

内容的提问来源于stack exchange,提问作者stefanosn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:39:00