C#在使用JSON.NET读取JSON内容时保留转义序列

本文关键字:JSON 保留 转义序列 NET 读取 | 更新日期: 2023-09-27 18:26:17

C#在使用JSON.NET 读取JSON内容时保留转义序列

给定以下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

C#在使用JSON.NET读取JSON内容时保留转义序列

我试过下面的代码,它很有效。。。也许我不明白问题出在哪里,或者你可以提供一个不适用的样本:

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]+" }

编辑
正如托马斯贾沃斯基所言,与其使用json=json.Replace("''","''''");,不如使用Regex.Replace(json, @"(?<!'')[''](?!'')", @"''"),它将执行相同的替换,但前提是尚未转义。连续两个退格未受影响。