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%22long=%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 混淆(但在其他平台上与 doubledouble double 相同)。我也很确定 JavaScript 的精度是不确定的。

以上是关于AFNetworking 在格式化 JSON 时将我的双打转换为带引号的字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JSON 格式解析通过 AFNetworking 1.0 获得的响应

AFNetworking POST 格式错误的 JSON - 单引号和 [Object] 参考

如何通过 AFNetWorking 2.0 将 JSON 格式的数据发送到 Web? [复制]

PHP REST 服务中的 JSON 格式问题从 AFNetworking 2.0 接收 POST

AFNetworking 3.0 未从响应中获取 json

使用 AFnetworking 保存 mp4