AFNetworking在格式化JSON时将我的双精度转换为带引号的字符串

时间:2012-11-09 03:48:44

标签: ios json encoding nsdictionary afnetworking

我第一次尝试在项目中使用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;
}

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

JSON几乎局限于可以用JavaScript表达的内容(因为它是一个子集),并且JavaScript不支持超过53位浮点数的大数字。由于双精度数通常是64位,如果将数字渲染为数字,这些将在解析期间被截断,这是当您将它们渲染为字符串时要避免的。

但这也意味着你需要将你的消费代码转换回双打(或等价物)。