在我创建了自己的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
如何达到这种级别的编码?
答案 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所说,在引入任何转义字符之前,您需要使用转义符来逃避转义字符。
但是,我认为你应该使用真正的编码器。 ; - )