自定义替换json编码不按预期输出双引号

时间:2013-03-07 15:43:12

标签: c# json escaping encode

在我创建了自己的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("\"", "\\\"")正在用"替换\\",这当然会生成无效的json,因为它会看到两个反斜杠(一个作为转义符,就像上面的那样) C#)作为json文件中的单个“真实”反斜杠,因此无法按预期转义双引号。 Replace("\\", "\\\\")调用完美无缺(但是,正如我所料,它会将两个反斜杠替换为两个反斜杠。)

我很容易根据我的观点告诉我,Replace方法没有执行这些函数,就像我期望的那样。我的问题是为什么?我知道我不能使用Replace("\"", "\\"")因为反斜杠也是C#的转义字符,所以它会产生语法错误。使用Replace("\"", "\"")也会很愚蠢,因为它会用双引号替换双引号。

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

2 个答案:

答案 0 :(得分:9)

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

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

return val.Replace("\r\n", " ")
          .Replace("\r", " ")
          .Replace("\n", " ")
          .Replace("\\", "\\\\")
          .Replace("\"", "\\\"");

答案 1 :(得分:3)

问题在于:

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

第一行用"替换\"。第二行将\"替换为\\"

正如Jon所说,在引入任何转义字符之前,您需要使用转义符来逃避转义字符。

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