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
我试过下面的代码,它很有效。。。也许我不明白问题出在哪里,或者你可以提供一个不适用的样本:
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, @"(?<!'')[''](?!'')", @"''")
,它将执行相同的替换,但前提是尚未转义。连续两个退格未受影响。