包含正斜杠/和HTML的string的NSJSONSerialization序列化被错误地转义

我试图将一些简单的HTML转换为JSON对象中的string值,我无法获得string编码不能转义NSJSONSerialization中的string。

示例…我有一个string,其中包含一些基本的HTML文本:

NSString *str = @"<html><body><p>Samples / Text</p></body></html>"; 

所需的结果是JSON与HTML作为值:

 { "Title":"My Title", "Instructions":"<html><body><p>Samples / Text</p></body></html>" } 

我正在使用标准技术将NSDictionary转换为包含JSON的NSString:

 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; [dict setObject:str forKey:@"Instructions"]; [dict setObject:@"My Title" forKey:@"Title"]; NSError *err; NSData *data = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&err]; NSString *resultingString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; NSLog(@"%@", resultingString); 

这个方法生成的JSON是有效的,但是所有的正斜杠都被转义了:

 { "Title":"My Title", "Instructions":"<html><body><p>Samples \/ Text<\/p><\/body><\/html>" } 

这会在指令JSONstring中创build无效的HTML。

我想坚持NSJSONSerialization,因为我们正在使用我们的框架中的其他任何地方,我被烧毁之前切换到非苹果库,因为他们得到不支持。 我已经尝试了许多不同的string编码,所有的字符都从尖括号中跳过。

显然\ /是JavaScript中对/字符的有效表示,这就是为什么正斜杠被转义(甚至是StackOverflow文本编辑器将其转义)。 请参阅: 用正斜杠转义jsonstring? 还有JSON:为什么正斜线逃脱? 。 我只是不希望它做到这一点,似乎没有办法阻止iOS序列化时逃脱string值正斜杠。

我相信NSJSONSerialization的行为就像编码HTML的devise。

如果你看一下关于在JSON中编码HTML的一些问题( 1,2 ),你会看到答案总是提到逃避正斜杠。

JSON不需要转义正斜杠,但HTML不允许javascriptstring包含</因为它可能与<SCRIPT>标记的末尾混淆。

请参阅这里的答案, 这里和大多数直接在B.3.2指定非HTML数据中指出的w3.org HTML4附录

 ILLEGAL EXAMPLE: The following script data incorrectly contains a "</" sequence (as part of "</EM>") before the SCRIPT end tag: <SCRIPT type="text/javascript"> document.write ("<EM>This won't work</EM>") </SCRIPT> 

虽然这种行为可能会导致您的问题NSJSONSerialisation只是按照旧的规则编码的HTML数据用于<SCRIPT>标记播放。

这是我的AFJSONRequestSerializer的子类,用于删除生成的JSON中的\ before / symbols; 如果您使用AFNetworking,方便

 class SanitizedAFJSONRequestSerializer: AFJSONRequestSerializer { override func requestBySerializingRequest(request: NSURLRequest!, withParameters parameters: AnyObject!, error: NSErrorPointer) -> NSURLRequest! { var request = super.requestBySerializingRequest(request, withParameters: parameters, error: error) if let jsonData = request.HTTPBody { if let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding) as? String { let sanitizedString = jsonString.stringByReplacingOccurrencesOfString("\\/", withString: "/", options: NSStringCompareOptions.CaseInsensitiveSearch, range:nil) as NSString println("sanitized json string: \(sanitizedString)") var mutableRequest = request.mutableCopy() as! NSMutableURLRequest mutableRequest.HTTPBody = sanitizedString.dataUsingEncoding(NSUTF8StringEncoding) request = mutableRequest } } return request } }