将特殊字符写入json文件会生成额外的反斜杠

时间:2018-02-20 05:17:28

标签: c# json json.net special-characters

更新:stackoverflow也正在解析反斜杠字符。在编写/编辑问题时,它会显示最终给出的图像(非常不同)中显示的输出,但页面上发布的实际问题却非常不同。请看图片。

我面临的问题是,在写入文件时我得到了额外的反斜杠。我正在生成图像路径(在网站上可用)以及一些文本和写在json文件中。要保存在文件中的图像路径的生成字符串为

ImagePath = "http://example.com/wp-content/uploads/"+YearcomboBox.Text+"/"+MonthcomboBox.Text+"/" + AddDashesFileName(Specialtitle) + ".jpg";

我需要输出/我文件中保存的字符串为

http://example.com/wp-content/uploads/2018/02/abc-def-gh-2018.jpg

而是通过双反斜杠

获取保存在文件中的路径

HTTP:\ / \ / example.com \ /可湿性粉剂内容\ /上传\ / 2018 \ / 02 \ /abc-def-gh-2018.jpg

我尝试将字符替换为

ImagePath = ImagePath.Replace("/",@"\\/");

在文件中插入两个反斜杠。 我必须保存一些包含特殊字符的字符串,如

string ss="\r\n\r\nThe bla bla bla..."; 

当我写这个字符串时,它保存带有双反斜杠的字符串 \\ r \\ n \\ r \\ n bla bla bla ...

而我需要格式为

的文本

\ r \ n \ r \ n bla bla bla ...

编写文件的完整代码为

string ss="\r\n\r\nThe bla bla bla..."; 
 ImagePath = "http://example.com/wp-content/uploads/"+YearcomboBox.Text+"/"+MonthcomboBox.Text+"/" + AddDashesFileName(Specialtitle) + ".jpg";
 ImagePath = ImagePath.Replace("/",@"\/");
 StringBuilder sb = new StringBuilder();
 StringWriter sw = new StringWriter(sb);
 using (JsonWriter writer = new JsonTextWriter(sw))
 {
     writer.Formatting = Formatting.Indented;
    writer.WriteStartObject();
         writer.WritePropertyName("path");writer.WriteValue(ImagePath );
         writer.WritePropertyName("text");writer.WriteValue(ss);
         writer.WriteEndObject();
.
.
.the json entries which are working fine
}
 File.AppendAllText(@"e:\json\file3.json", sb.ToString());

更新: enter image description here

1 个答案:

答案 0 :(得分:2)

您正在尝试将无效数据存储到JSON文件中。

反斜杠(\)是JSON格式的特殊字符。它用于转义文件中的特殊字符。如果您的字符串值包含反斜杠本身,则需要将其转义(创建\\)。在您的JSON文件中放置一个反弹将会逃脱下一个角色。

现在JSON转换器通常会为您执行此操作,因此您不必担心它。这意味着价值:

  

http://specser.com/wp-content/uploads/2018/2/Special.jpg

应在JSON文件中格式化为:

  

HTTP:\\ / \\ / specser.com \\ /可湿性粉剂内容\\ /上传\\ / 2018 \\ / 2 \\ / Special.jpg

但是,我不清楚为什么要转义正斜杠,因为这些非转义非常有效,无法存储在JSON文件中。

对于文本值,换行符(\n)是一个特殊字符。这意味着如果它基于用户输入,其中用户自己写入反斜杠后跟 n (“\ n”),则大多数组件会将其解释为文本而不是特殊字符( ofcourse这在很大程度上取决于你使用的是什么)。

您可以通过逐字字符串看到差异:

string ss = "\r\n\r\nThe bla bla bla...";  // JSON: "\r\n\r\nThe bla bla bla..."
string ss = @"\r\n\r\nThe bla bla bla..."; // JSON: "\\r\\n\\r\\nThe bla bla bla..."

在逐字版本中,反斜杠和字母 n 都存储为单独的字符,而不是换行符。

总而言之,您展示的示例正是JSON应该如何工作的。您可以签出基于您的示例代码的this fiddle,它可以正常工作。