Ios NSJSONSerialization编码?

Ios NSJSONSerialization编码?,ios,json,dictionary,url-encoding,nsjsonserialization,Ios,Json,Dictionary,Url Encoding,Nsjsonserialization,我正在尝试将NSDictionary转换为json字符串,然后通过HTTPBody(POST请求)将数据发送到我的web api。我将字典转换为json,如下所示: NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error]; 我发现上面的方法并没有对我的数据进行编码(至少没有处理特殊字符,如符号和)。因此,服务器端接收到的数据非常混乱,我无法正确读取 有关正

我正在尝试将NSDictionary转换为json字符串,然后通过HTTPBody(POST请求)将数据发送到我的web api。我将字典转换为json,如下所示:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:0 error:&error];
我发现上面的方法并没有对我的数据进行编码(至少没有处理特殊字符,如符号和)。因此,服务器端接收到的数据非常混乱,我无法正确读取

有关正在发生的情况的更多详细信息,请使用以下词典:

"salutation":"Mrs."
"companyName":"T & F LLP"
"firstName":"Tania"
"country":"Canada"
使用上述方法将此词典转换为NSData,然后像这样使用

[request setHTTPBody:nsDataFromJson];
我在服务器端接收什么?我明白了

{"contact":"{\"firstName\":\"Tania\",\"salutation\":\"Mrs.\",\"company\":\"Aird 
我只获取特殊字符
&
的数据,我只能假设这是因为我提到的第一种方法不是编码像
&
这样的特殊字符

因此,我通过将字典转换为json字符串,然后将每个
&
替换为
%26
,然后从这个新字符串(处理特殊字符)创建NSData,解决了这个问题(就目前而言)。然后我在我的服务器上得到整个身体

你知道如何正确处理这个问题吗


顺便说一下,如果我也使用SBJSON,同样的问题也会发生。

已经3个月了,所以我想问题现在一定已经解决了

接收到的JSON数据损坏的原因是解析器将&(符号)解释为URL地址的一部分。借用了一些代码,我编写了这个函数来进行百分比编码&以及一些可能会混淆的其他字符:

+ (NSDictionary*) percentEncodeDictionayValues:(NSDictionary*) dict
{
    NSMutableDictionary* edict=[NSMutableDictionary dictionaryWithDictionary:dict];

    NSMutableCharacterSet* URLQueryPartAllowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy];
    [URLQueryPartAllowedCharacterSet removeCharactersInString:@"?&=@+/'"];

    for(NSString* key in [dict allKeys])
    {
        if([dict[key] isKindOfClass:[NSString class]])
            edict[key] = [dict[key] stringByAddingPercentEncodingWithAllowedCharacters:URLQueryPartAllowedCharacterSet];
    }
    return edict;
}

因此,在输入NSJSONSerialization之前,可以使用此函数预处理NSDictionary对象,接收到的数据将保留&和其他字符

显然,您正在使用一种技术传输JSON数据,这种技术会破坏它不喜欢的数据。这不是JSON的问题,但是您可能选择了错误的协议,或者由于您选择的协议,您没有以某种方式逃逸数据。@Daij Djan-读取ASCII不会导致
&
出现问题。那么我的问题可能是如何正确编码HTTPBody?更具体地说,i'html如何转义HTTPBody?例如,在我的android应用程序上,当我将字典转换为json时,我得到的是
\uc0026
,而不是符号,当我将数据发送到我的服务器时,我收到了完整的负载,我的服务器很高兴@HotLicks,我的请求是通过正常的NSUrlRequest完成的,web服务是一个.NET asmx web服务。我的字符编码思想显然是错误的。hot Clicks知道答案已经好几个小时了,也许他现在会发布。最好的方法是使用一种将JSON作为纯二进制处理的协议。这是您在HTTP请求中分配的类型的函数,并使用IIRC、POST vs PUT。