一尘不染

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

json

我正在尝试将一些简单的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在序列化时转义字符串值中的正斜杠。


阅读 316

收藏
2020-07-27

共1个答案

一尘不染

我认为NSJSONSerialization在编码HTML方面的行为符合设计要求。

如果你看一些问题在JSON上编码的HTML,你会看到答案总是提逃避正斜杠。

JSON不需要转义正斜杠,但HTML不允许包含javascript字符串,</因为它可能与<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>标记中使用的规则进行操作。

2020-07-27