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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:50:15