我正在尝试将一些简单的HTML转换为JSON对象中的字符串值,并且在获取字符串编码以免在NSJSONSerialization中转义字符串时遇到了麻烦。
示例…我有一个包含一些基本HTML文本的字符串:
NSString *str = @"<html><body><p>Samples / Text</p></body></html>";
期望的结果是将HTML作为值的JSON:
{ "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是有效的,但是HTML的所有正斜杠均已转义:
{ "Title":"My Title", "Instructions":"<html><body><p>Samples \/ Text<\/p><\/body><\/html>" }
这将在指令JSON字符串中创建无效的HTML。
我想坚持使用NSJSONSerialization,因为我们在框架中的其他地方都使用了NSJSONSerialization,在被取消支持之前,我在切换到非Apple库之前已经被烧死了。我尝试了许多不同的字符串编码,并且所有这些编码都避开了尖括号。
显然,\ /是JavaScript中/字符的有效表示形式,这就是为什么正斜杠被转义的原因(甚至是StackOverflow文本编辑器也对其进行了转义)。请参阅:使用正斜杠转义json字符串? 以及JSON:为什么正斜杠转义了?。我只是不希望它这样做,而且似乎没有一种方法可以阻止iOS在序列化时转义字符串值中的正斜杠。
我认为NSJSONSerialization在编码HTML方面的行为符合设计要求。
NSJSONSerialization
如果你看一些问题在JSON上编码的HTML,你会看到答案总是提逃避正斜杠。
JSON不需要转义正斜杠,但HTML不允许包含javascript字符串,</因为它可能与<SCRIPT>标记的末尾混淆。
</
<SCRIPT>
最直接的答案,即w3.orgHTML4附录,该附录在B.3.2中进行了说明指定非HTML数据
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>标记中使用的规则进行操作。
NSJSONSerialisation