如何通过使用Objective-C转义所有特殊字符将NSString转换为JSON

如何通过使用Objective-C转义所有特殊字符将NSString转换为JSON,objective-c,json,Objective C,Json,我创建了一个函数来生成一个完美的JSON字符串: -(NSString *)NSStringToJson:(NSString *)str { NSMutableString *s = [NSMutableString stringWithString:str]; [s replaceOccurrencesOfString:@"\"" withString:@"\\\\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s

我创建了一个函数来生成一个完美的JSON字符串:

-(NSString *)NSStringToJson:(NSString *)str
{
    NSMutableString *s = [NSMutableString stringWithString:str];
    [s replaceOccurrencesOfString:@"\"" withString:@"\\\\" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"/" withString:@"\\/" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\n" withString:@"\\n" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\b" withString:@"\\b" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\f" withString:@"\\f" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\r" withString:@"\\r" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\t" withString:@"\\t" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"\{" withString:@"\\{" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    [s replaceOccurrencesOfString:@"}" withString:@"\\}" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [s length])];
    return [NSString stringWithString:s];
}
问题

上述函数无法将下面给定的字符串转换为JSON字符串

üáñ~!@#$%^&*()_+-=[\]{}|;’:”,./<>?~
üáñ~!@$%^&*()_+-=[\]{}|;’:”,./?~
{“国家”:“233”,“电子邮件”:“名字”: “üáñ~!@$%^&*(),./?-=[]];”,“姓氏”:“,”
“手机”:“令牌”:“111”}


我正在使用验证字符串,而解析器显示错误。

这太荒谬了。使用
NSJSONSerialization

你远没有转化所有需要转化的东西,你正在转化那些不需要转化的东西。除非您的目标是编写一个比现有的JSON序列化器更好的JSON序列化器,否则手工编写而不是使用专门为您设计的类来编写JSON序列化器是为MUG设计的


我不太明白你为什么要用两个反斜杠来转换双引号。当然,你根本不会处理字符串中的反斜杠。这就是问题所在,您需要编写自己的错误代码,而不是使用适当的库。(另一个问题是,您正在编写错误代码,我敢打赌,您实际上没有咨询过包含JSON标准的RFC)。

这太荒谬了。使用
NSJSONSerialization

你远没有转化所有需要转化的东西,你正在转化那些不需要转化的东西。除非您的目标是编写一个比现有的JSON序列化器更好的JSON序列化器,否则手工编写而不是使用专门为您设计的类来编写JSON序列化器是为MUG设计的


我不太明白你为什么要用两个反斜杠来转换双引号。当然,你根本不会处理字符串中的反斜杠。这就是问题所在,您需要编写自己的错误代码,而不是使用适当的库。(另一个问题是,您正在编写错误代码,我敢打赌您实际上没有参考过包含JSON标准的RFC)。

如果您使用的是
NSURLConnection

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
  {
    NSError *error;
    NSDictionary *output = [NSJSONSerialization
                            JSONObjectWithData:receivedData
                                       options:kNilOptions
                                        error:&error];
    NSLog(@"output : %@",output);
  }

如果您使用的是
NSURLConnection

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
  {
    NSError *error;
    NSDictionary *output = [NSJSONSerialization
                            JSONObjectWithData:receivedData
                                       options:kNilOptions
                                        error:&error];
    NSLog(@"output : %@",output);
  }