为URL编码JSON数据

时间:2013-09-05 12:50:45

标签: ios json nsurl

在iOS中,我想在URL中发送JSON数据以进行服务调用。我尝试了下面的代码剪切,但编码的URL似乎错了。因为在JSON中,键和值之间有一个冒号字符(:),逗号字符(,)用于分隔。但是,我无法将冒号(:)编码为%3A ,将逗号(,)编码为%2C

代码段:

- (NSURL *)getEncodedUrl {

    // Build dictionnary with parameters
    NSString *abc = @"abc";
    NSNumber *limitNumber = [NSNumber numberWithInt:2];
    NSMutableDictionary *dictionnary = [NSMutableDictionary dictionary];
    [dictionnary setObject:limitNumber forKey:@"limit"];
    [dictionnary setObject:abc forKey:@"abc"];

    NSError *error;
    NSData *jsonData =  [NSJSONSerialization dataWithJSONObject:dictionnary options:0 error:&error];

    if (!jsonData) {
        debug("Json error %@",error);
        return nil;
    } else {

        NSString *JSONString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];
        debug("Json op %@",JSONString);

        NSString* params = [JSONString stringByAddingPercentEscapesUsingEncoding:
                            NSASCIIStringEncoding];

        NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://baseUrl.com?param=@",params]];
        debug("URL = %@",url);

        return url;


    }

}

输出:〜

网址= http://baseUrl.com?param=%7B%22abc%22:%22abc%22,%22limit%22:2%7D

(包括冒号和逗号字符)

但我想跟随o / p:

http://baseUrl.com?param=%7B%22abc%22%3A%22abc%22%2C%22limit%22%3A2%7D

(没有冒号和逗号字符)

我现在提到的在线编码 - 解码网站。

http://www.url-encode-decode.com/

4 个答案:

答案 0 :(得分:0)

你可以简单地使用

 NSString *url = @"http://baseUrl.com?param=%7B%22abc%22:%22abc%22,%22limit%22:2%7D";

   NSString *encodeImgUrl = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

答案 1 :(得分:0)

我建议您将JSON作为POST数据而不是您正在使用的GET发送。将它打包为MIME数据会更直接,你所做的任何编码都会更容易理解。

答案 2 :(得分:0)

所以你试图在这里生成一个URL的查询部分。冒号是包含在URL查询中的完全合法的字符。我写了一篇文章,介绍了在Cocoa中转义URL查询的复杂性:

http://www.mikeabdullah.net/escaping-url-queries-in-cocoa.html

由于您希望执行额外的转义,我建议您使用我的示例代码并将其扩展为特别要求转义:;个字符。

答案 3 :(得分:0)

我在API调用中犯了小错误,这就是为什么我得错了结果。无需将冒号(:)编码为%3A,将逗号(,)编码为%2C。

我想与您分享一件事。您可以使用base64字符串而不是编码JSON部分。