当前位置: 首页 > 面试题库 >

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

云鸿祯
2023-03-14
问题内容

我正在尝试将一些简单的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方面的行为符合设计要求。

如果你看一些问题在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>标记中使用的规则进行操作。



 类似资料:
  • 问题内容: 我有一个iOS应用程序,需要处理来自Web服务的响应。响应是包含序列化JSON对象的序列化JSON字符串,如下所示: 请注意,此响应是JSON 字符串 ,而不是JSON对象。我需要做的是将字符串反序列化,这样我就可以得到: 然后我可以用来反序列化为。 但是,我该如何第一步?也就是说,如何“解串”字符串,以便拥有序列化的JSON对象? 仅当顶级对象是数组或字典时才有效;它不适用于字符串。

  • 我已经阅读了这个类似问题的答案:YAML中的字符串是否需要引号? 然而,对于是否可以用包含正斜杠的字符串转义引号,没有答案。 例如,我们是否需要将引号添加到以下eslint规则“react/no deprecated”:off?

  • null Groovy:找不到四位十六进制字符代码

  • 问题内容: 谁能告诉我在Java中如何使用正斜杠转义字符。我知道反斜杠是\ \,但是我尝试了\ /和/ /却没有运气! 这是我的代码: 提前致谢! 问题答案: 您既不需要以Java语言或正则表达式来转义正斜杠。 还要注意这样的块: 更紧凑和可读地写为: 因此,对于您而言,我相信您的方法应类似于: 请注意,这不是测试有效日期的一种非常好的方法-可能也应该尝试将其解析 为 日期,或者将其解析 为 日期

  • 问题内容: 我有一个字符串存储为: 有没有办法我可以转换成? 问题答案: 您可以为此使用: 输出:

  • 本文向大家介绍Python中的左斜杠、右斜杠(正斜杠和反斜杠),包括了Python中的左斜杠、右斜杠(正斜杠和反斜杠)的使用技巧和注意事项,需要的朋友参考一下 首先,"/"左倾斜是正斜杠,"\"右倾斜是反斜杠,可以记为:除号是正斜杠一般来说对于目录分隔符,Unix和Web用正斜杠/,Windows用反斜杠,但是现在Windows (一)目录中的斜杠们 python读文件需要输入的目录参数,列出以下