首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#在使用Json.NET读取JSON内容时保留转义序列

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

Stack Overflow用户
提问于 2015-12-10 12:44:52
回答 1查看 1.5K关注 0票数 2

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

考虑到以下json文本内容:

代码语言:javascript
复制
{ "Pattern": "[0-9]*\t[a-z]+" }

它反映在一个简单的类中:

代码语言:javascript
复制
public class Rule
{
    public string Pattern { get; set; }

    public bool Test(string text)
    {
        return new Regex(Pattern).IsMatch(text);
    }    
}

它被反序列化成这样:

代码语言:javascript
复制
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,但是当查找令牌时,这个值已经被解析了。

小提琴

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-10 14:48:17

我已经尝试了下面的代码,并且它是works...maybe,我不明白是什么问题,或者您可以提供一个不适用于此的示例:

代码语言:javascript
复制
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只包含以下内容:

代码语言:javascript
复制
{ "Pattern": "[0-9]*\t[a-z]+" }

编辑

正如托马斯贾沃斯基所指出的,与json=json.Replace("\\","\\\\");相比,使用Regex.Replace(json, @"(?<!\\)[\\](?!\\)", @"\\")更好,它将执行相同的替换,但前提是尚未转义。行中的两个后置空间不受影响。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34202247

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档