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

时间:2015-12-10 12:44:53

标签: c# json regex

使用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

1 个答案:

答案 0 :(得分:0)

我已经尝试了下面的代码并且它有效...也许我不明白这是什么问题,或者你可以提供一个不适用的样本:

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, @"(?<!\\)[\\](?!\\)", @"\\")更好 ,它会做同样的替换,但只有在尚未转义的情况下。行中的两个退格是不受影响的。