使用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,但是在查找令牌时,该值已经解析。

FIDDLE

最佳答案

我尝试了下面的代码,它可以工作...也许我不明白问题出在哪里,或者您可以提供一个与此不兼容的示例:

StreamReader s= new StreamReader(@"test.txt");
string json = s.ReadToEnd();
json=json.Replace("\\","\\\\");
JObject obj = JObject.Parse(json);
string pattern = obj["Pattern"].ToString();
bool test = Regex.IsMatch("1    a", pattern);


test.txt包含以下内容:

{ "Pattern": "[0-9]*\t[a-z]+" }


编辑
Thomasjaworsky所述,最好使用json=json.Replace("\\","\\\\");代替Regex.Replace(json, @"(?<!\\)[\\](?!\\)", @"\\")
,它将进行相同的替换,但前提是尚未转义。行中的两个退格键保持不变。

10-06 04:08
查看更多