包含正斜杠/和HTML的字符串的NSJSONSerialization序列化未正确转义

Jas*_*onD 10 json nsstring ios nsstringencoding nsjsonserialization

我试图将一些简单的HTML转换为JSON对象中的字符串值,并且我无法使字符串编码无法转义NSJSONSerialization中的字符串.

示例...我有一个包含一些基本HTML文本的字符串:

NSString *str = @"<html><body><p>Samples / Text</p></body></html>";
Run Code Online (Sandbox Code Playgroud)

期望的结果是JSON,其中HTML为值:

{
    "Title":"My Title",
    "Instructions":"<html><body><p>Samples / Text</p></body></html>"
}
Run Code Online (Sandbox Code Playgroud)

我正在使用标准技术将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);
Run Code Online (Sandbox Code Playgroud)

此方法生成的JSON有效,但HTML包含所有正斜杠转义:

{
    "Title":"My Title",
    "Instructions":"<html><body><p>Samples \/ Text<\/p><\/body><\/html>"
}
Run Code Online (Sandbox Code Playgroud)

这会在JSON字符串指令中创建无效的HTML.

我想坚持使用NSJSONSerialization,因为我们在我们的框架中的其他地方都使用它,并且在切换到非Apple库之前我已经被烧毁了,因为它们得不到支持.我尝试了很多不同的字符串编码,它们都逃脱了尖括号.

显然\ /是JavaScript中对/字符的有效表示,这就是转义正斜杠的原因(即使StackOverflow文本编辑器也将其转义).请参阅: 使用正斜杠转义json字符串? 还有JSON:为什么正斜线逃脱了?.我只是不希望它这样做,似乎没有办法阻止iOS在序列化时转义字符串值中的正斜杠.

Jes*_*edc 5

我相信NSJSONSerialization它的行为符合 HTML 编码的设计。

如果您查看有关在 JSON 中编码 HTML 的一些问题(1、2 ,您会看到答案总是提到转义正斜杠。

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

请参阅此处的答案,此处以及最直接的w3.org HTML4 附录,其中在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>
Run Code Online (Sandbox Code Playgroud)

尽管这种行为可能会给您带来问题,NSJSONSerialisation但这只是遵循编码 HTML 数据以在标签中使用的古老规则<SCRIPT>