Objective-C开发遇NSInvalidArgumentException JSON写入无效类型错误求助
问题根因
- 该异常是AFNetworking组件在将请求参数序列化为JSON格式时抛出的,错误提示明确说明参数中存在
NSError类型的对象,该类型不属于合法的JSON可序列化类型,因此触发崩溃。 - 你调用
[MTLJSONAdapter JSONArrayFromModels:events error:NULL]时直接给error参数传了NULL,忽略了模型转JSON的错误返回:当events数组中存在不符合JSON转换规则的模型时,转换过程产生的NSError对象会被混入返回的params数组,或是转换完全失败后你依然把非法返回值作为请求参数传入了POST方法,最终导致序列化失败。
解决方案
- 补全模型转JSON的错误处理,不要忽略转换阶段的错误,转换失败时直接走错误回调,不要发起无效请求
NSError *convertError = nil; NSArray *params = [MTLJSONAdapter JSONArrayFromModels:events error:&convertError]; // 转换失败直接返回错误 if (convertError || !params) { completion(convertError ?: [NSError errorWithDomain:@"C8Analytics" code:-1 userInfo:@{NSLocalizedDescriptionKey:@"事件数据转换失败"}]); return; }
- 额外增加参数合法性校验,过滤掉非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); }
- 排查events数组的数据源生成逻辑,确认是否有NSError对象被误加入到events数组中。
内容的提问来源于stack exchange,提问作者stefanosn
相关产品推荐
相关产品推荐

