为啥 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON?

Posted

技术标签:

【中文标题】为啥 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON?【英文标题】:Why is NSJSONSerialization parsing NSDictionary incorrectly into JSON?为什么 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON? 【发布时间】:2015-09-14 09:57:27 【问题描述】:

我正在从 ios 应用程序向服务器发出 POST 请求,并发送电子邮件和密码值的 JSON 有效负载。

到目前为止,我的代码正在创建一个 NSDictionary 并将其序列化为 NSData

NSDictionary *dictionary = @ @"email" : @"khush@gmail.com" , @"password" : @"mypass" ;

NSData *payload = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:nil];

我将负载作为request.HTTPBody 的一部分附加,但是服务器接收到以下数据:

'"email":"khush@gmail.com", "password":"mypass"' : ' '

它似乎将整个字符串作为键并发出 null 作为值。

对这个问题有什么想法/解决方案吗?我已经看过了,但它对我来说没有 See this link sense。

【问题讨论】:

不是从字典的转换 -> JSON,而是 HTTP 请求中的格式失败。 +1 @***foe 您如何将有效负载“附加”为 HTTP 正文的一部分?您的服务器是否支持将 JSON 作为请求正文的一部分? 最简单的方法是在附加 JSON 字符串之前对其进行调试。如果它是有效的,那么接下来的事情就是罪魁祸首。 尝试将 NSData 转换为 NSString 并将此字符串传递给服务器,因为一些 Web 开发人员接受 json 字符串而不是对象。示例:NSString *strJson = [[NSString alloc]initWithData:payload encoding:NSUTF8StringEncoding]; request.httpBody = strJson; 你的问题是错误的。您在问“为什么”,而答案是“不是,您的问题出在其他地方”。 【参考方案1】:

您的有效负载没有任何问题。 HTTP 层中的数据被弄乱了。请确保您在请求标头中设置了以下内容类型。

"Content-Type" = "application/json";

【讨论】:

那么服务器正在接收 JSON,它只是一团糟,所以我怀疑这是问题所在。 你是对的。但是,如果内容类型被错误地设置为application/x-www-form-urlencoded,那么它会以 JSON 的形式出现,但会以混乱的形式出现。让我们看看这是否有助于 OP。 天哪!几乎一天都失去了这个,我不知道。在 Swift 3 中执行此操作:request.setValue("application/json", forHTTPHeaderField: "Content-Type")【参考方案2】:

好像你在做类似的东西

request.HTTPBody = encodedVersionOfPayload;

而你应该标记的东西更像

request.HTTPBody = [NSString stringWithFormat:@"%@=%@", yourKey, encodedVersionOfPayload];

请向我们展示您的这部分代码。


更新

快速查看文档后,NSMutableURLRequest,HTTPBody 属性是 NSData 而不是 NSString,

所以你可能写过

request.HTTPBody = payload;

你应该有更多类似的东西

NSString *jsonString = [[NSString alloc] initWithData:payload encoding:NSUTF8StringEncoding];
NSString *payloadString = [NSString stringWithFormat:@"data=%@", jsonString];
request.HTTPBody = [payloadString dataUsingEncoding:NSUTF8StringEncoding];

(未经测试但应该是正确的,您的 json 对象应该在您的服务器上使用“数据”键可用)

【讨论】:

以上是关于为啥 NSJSONSerialization 将 NSDictionary 错误地解析为 JSON?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSJSONSerialization 将 NSMutableDictionary 转换为 JSON 会返回不同的结果

使用 NSJSONSerialization 将 NSDictionary 转换为 NSData

iOS - NSJSONSerialization:无法将数据转换为围绕字符的字符串

Swift - NSJsonSerialization - “无法将数据转换为围绕字符的字符串”错误

无法使用 NSJSONSerialization 将数字转换为 JSON 值

通过 NSJSONSerialization 下载 JSON 数据