将NSDictionary转换为含两个对象的JSON时遇NSInvalidArgumentException错误
解决NSJSONSerialization抛出NSInvalidArgumentException:Invalid top-level type in JSON write
问题重现
你在尝试将NSDictionary转换为JSON时触发了如下异常:
NSException * name: @"NSInvalidArgumentException" - reason: @"*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write" 0x000060000044dda0
你的相关代码如下:
NSMutableDictionary *clientinfo = [[ NSMutableDictionary alloc] init]; [clientinfo setObject:remittance.cliente.cliente_id forKey:ST_clientID]; NSMutableDictionary *country = [[ NSMutableDictionary alloc] init]; [country setObject:remittance.pais.paisID forKey:ST_countryID]; NSMutableDictionary *remittancedata = [[ NSMutableDictionary alloc] init]; [remittancedata setObject:remittance.nroIdentificacion forKey:ST_noidentification]; [remittancedata setObject:clientinfo forKey:ST_client]; [remittancedata setObject:country forKey:ST_country]; NSError *err = nil; NSData * jsonData = [NSJSONSerialization dataWithJSONObject:remittance options:0 error:&err]; NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
错误原因
问题非常明确:你错误地将自定义模型对象remittance传入了dataWithJSONObject:方法,而不是你精心构建的remittancedata字典。
NSJSONSerialization要求序列化的顶级对象必须是NSArray或者NSDictionary类型,remittance作为自定义模型(非JSON支持的基础容器类型),自然会触发“Invalid top-level type”的异常。
修复后的代码
只需要修改序列化那一行,把参数换成remittancedata即可:
NSMutableDictionary *clientinfo = [[ NSMutableDictionary alloc] init]; [clientinfo setObject:remittance.cliente.cliente_id forKey:ST_clientID]; NSMutableDictionary *country = [[ NSMutableDictionary alloc] init]; [country setObject:remittance.pais.paisID forKey:ST_countryID]; NSMutableDictionary *remittancedata = [[ NSMutableDictionary alloc] init]; [remittancedata setObject:remittance.nroIdentificacion forKey:ST_noidentification]; [remittancedata setObject:clientinfo forKey:ST_client]; [remittancedata setObject:country forKey:ST_country]; NSError *err = nil; // 这里把remittance换成remittancedata NSData * jsonData = [NSJSONSerialization dataWithJSONObject:remittancedata options:0 error:&err]; NSString * jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
这样修改后,remittancedata作为合法的NSDictionary类型,就能被正常序列化为JSON数据了。
内容的提问来源于stack exchange,提问作者julian david
相关产品推荐
相关产品推荐

