2

我第一次尝试在一个项目上使用 AFNetworking 并且无法将浮点数设置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%22Sinatra 将它们接收为:

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;
}
4

3 回答 3

1

看起来您是在查询字符串中以 URL 形式编码的形式提交参数;查询字符串中的所有内容都是字符串。

相反,您应该将参数作为 JSON 发送。将parameterEncodingHTTP 客户端的属性设置为 AFJSONParameterEncoding,一切都应该按预期工作。

于 2012-11-09T16:11:33.057 回答
0

要发送号码,您可以为您的经理使用“AFJSONRequestSerializer”。它解决了我同样的问题

于 2014-04-02T15:04:56.063 回答
-1

JSON 几乎仅限于可以用 JavaScript 表达的内容(因为它是一个子集),并且 JavaScript 不支持超过 53 位浮点的大数字。由于双精度通常是 64 位,因此如果呈现为数字,它们会在解析过程中被截断,而在将它们呈现为字符串时会避免这种情况。

但这也意味着您的消费代码可以转换回双精度(或等效)。

于 2012-11-09T05:21:15.367 回答