3

在我创建了自己的 json 编码器之后,我意识到它用两个转义的反斜杠代替了双引号,而不是一个。

我现在意识到 C# 有一个内置Json.Encode()方法,是的,我已经让它工作了,但是,我对为什么下面的代码(我构建的 json 编码器)没有像我一样替换引号感到困惑预计。

这是我的 json 编码器方法:

public static string jsonEncode(string val)
{
    val = val.Replace("\r\n", " ")
             .Replace("\r", " ")
             .Replace("\n", " ")
             .Replace("\"", "\\\"")
             .Replace("\\", "\\\\");

    return val;
}

replace 调用:Replace("\"", "\\\"")替换"\\",这当然会产生无效的 json,因为它将两个反斜杠(一个作为转义字符,很像上面的 C#)视为 json 文件中的单个“真实”反斜杠,因此不会转义双引号,如预期的那样。然而,该Replace("\\", "\\\\")调用完美地工作(即,它用两个反斜杠替换了一个反斜杠,正如我所期望的那样)。

根据我的论点,我很容易说出 Replace 方法没有执行功能,正如我所期望的那样。我的问题是为什么?我知道我不能使用Replace("\"", "\\"")反斜杠,因为它也是 C# 的转义字符,所以它会产生语法错误。使用Replace("\"", "\"")也很愚蠢,因为它会用双引号代替双引号。

为了更好地理解 C# 中的 replace 方法,我很想知道为什么 Replace 方法的行为与我预期的不同。如何Json.Encode达到这种编码水平?

4

2 回答 2

9

您正在替换"\"然后两个反斜杠替换任何反斜杠......这将包括您已经创建的反斜杠。在纸上一次执行一个操作,您会看到相同的效果。

您需要做的就是反转转义的顺序,以便您先转义反斜杠,然后再引用:

return val.Replace("\r\n", " ")
          .Replace("\r", " ")
          .Replace("\n", " ")
          .Replace("\\", "\\\\")
          .Replace("\"", "\\\"");
于 2013-03-07T15:45:52.853 回答
3

问题在这里:

Replace("\"", "\\\""); // convert " to \"
Replace("\\", "\\\\"); // which are then converted to \\"

第一行替换"\"。第二行将那些新的替换\"\\".

正如乔恩所说,在引入任何转义字符之前,您需要运行转义字符的替换。

但是,我认为您应该使用真正的编码器。;-)

于 2013-03-07T15:45:59.693 回答