AFNetworking 在格式化 JSON 时将我的双打转换为带引号的字符串
Posted
技术标签:
【中文标题】AFNetworking 在格式化 JSON 时将我的双打转换为带引号的字符串【英文标题】:AFNetworking is converting my doubles into quoted strings when formatting JSON 【发布时间】:2012-11-09 03:48:44 【问题描述】:我第一次尝试在一个项目中使用 AFNetworking,但在设置将 float double
转换为 JSON 参数时遇到问题。我正在创建一个带有键值对的 NSDictionary。 NSDictionary 只接受对象,因此使用[NSNumber numberWithDouble: 37.234567]
创建双精度值。都好。但是当我转储字典时,我得到:
Dict:
day = Wednesday;
user = Meltemi;
lat = "37.234567";
long = "-120.123456";
当作为 HTTP 请求提交时,变为:lat=%2237.234567%22
和 long=%22-120.123456%22
,而 Sinatra 将它们接收为:
params: "lat"=>"\"37.750256\"", "long"=>"\"-120.123456\"", ...
我想要/需要什么:
Dict:
day = Wednesday;
user = Meltemi;
lat = 37.234567;
long = -120.123456;
API 很可能不是容错的,但是如何强制 AFNetworking 丢失引号?
编辑:添加 AFHTTPClient 子类的初始化器:
- (id)initWithBaseURL:(NSURL *)url
self = [super initWithBaseURL:url];
if(!self) return nil;
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"application/json"];
[self setParameterEncoding:AFJSONParameterEncoding];
[self setAuthorizationHeaderWithUsername:@"user" password:@"pwd"];
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES]; // TODO: right place for this?
return self;
【问题讨论】:
NSDecimalNumber 有改善吗? 欣赏这个想法,但我不明白它会如何......坦率地说,我讨厌在 Cocoa/ios 中使用 NSDecimalNumber ......所以宁愿不要一时兴起走这条路,除非有一定程度的确定性 NSDecimalNumber 是答案... 【参考方案1】:看起来您是在查询字符串中以 URL 形式编码的形式提交参数;查询字符串中的所有内容都是字符串。
相反,您应该将参数作为 JSON 发送。将 HTTP 客户端的 parameterEncoding
属性设置为 AFJSONParameterEncoding,一切都应该按预期工作。
【讨论】:
见我上面的编辑。这就是我共享的 AFHTTPClient 子类的启动方式。也许[self setParameterEncoding:AFJSONParameterEncoding]
应该转移到另一个方法?!?【参考方案2】:
要发送号码,您可以使用“AFJSONRequestSerializer” 为您的经理。它解决了我同样的问题
【讨论】:
【参考方案3】:JSON 几乎仅限于可以用 javascript 表达的内容(因为它是一个子集),并且 JavaScript 不支持超过 53 位浮点的大数字。由于双精度通常是 64 位,如果呈现为数字,它们会在解析过程中被截断,当你将它们呈现为字符串时,你会避免这种情况。
但这也意味着您的消费代码可以转换回双精度(或等效)。
【讨论】:
double
在包括 iOS 在内的大多数平台上的 p=53;也许您将它与在某些平台上具有 p=64 的 long double
混淆(但在其他平台上与 double
或 double double
相同)。我也很确定 JavaScript 的精度是不确定的。以上是关于AFNetworking 在格式化 JSON 时将我的双打转换为带引号的字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JSON 格式解析通过 AFNetworking 1.0 获得的响应
AFNetworking POST 格式错误的 JSON - 单引号和 [Object] 参考
如何通过 AFNetWorking 2.0 将 JSON 格式的数据发送到 Web? [复制]