【发布时间】:2016-03-16 02:37:48
【问题描述】:
使用 Json.NET 读取 JSON 内容时,C# 保留转义序列
给定以下 json 文本内容:
{ "Pattern": "[0-9]*\t[a-z]+" }
这体现在一个简单的类中:
public class Rule
{
public string Pattern { get; set; }
public bool Test(string text)
{
return new Regex(Pattern).IsMatch(text);
}
}
它是这样反序列化的:
var json = System.IO.File.ReadAllText("file.json");
var rule = JsonConvert.DeserializeObject<Rule>(text);
Pattern 的值应该是一个正则表达式模式。问题是,一旦读取内容,“\t”转义序列会立即作为一个制表符的转义字符应用,导致字符串值:[0-9]* [a-z]+。
我的理解是内容格式有些不正确,因为它应该看起来像这样:[0-9]*\\t[a-z]+ 在 Json 内容中有效,转义反斜杠以便可以保留并导致实际模式[0-9]*\t[a-z]+。但是该文件是用户编辑的,我希望能够松散地解释内容,假设应该保留反斜杠(并且不会转换转义序列)。
我尝试实现自定义JsonConverter,但在查找令牌时,该值已解析。
【问题讨论】:
-
也许我错了,但这些模式不是等效的吗?
\t或选项卡应该与正则表达式给出相同的结果,不是吗? -
user edited。难道你不能假设如果用户能够编辑JSON文件,他就知道需要转义反斜杠吗? -
@Rob 这可能是真的,是的,在
\t的情况下,但是由于正则表达式的复杂性,变化越来越小 -
@MichaelMairegger 是的,我可以,但我知道用户的工作方式,他们使用像 regexhero.net 这样的工具并复制正则表达式模式,更改它,再次复制。 ...一个复杂的模式可以有多次出现。如果他们也可以将其粘贴到我们的配置文件中,那就太好了,粘贴值时出错的可能性很高。 [* 唯一的例外是不包含 " 这会破坏字符串,但我们不希望在正则表达式中包含它]
-
我相信问题出在其他地方:在文件中,
\t是文字\和文字t,应该读作"\\t"C 字符串。