为啥 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 - “无法将数据转换为围绕字符的字符串”错误