2015-12-10 41 views
2

C#閱讀使用Json.NETC#閱讀使用Json.NET

考慮下面的JSON文本內容JSON內容時保留轉義序列JSON內容時保留轉義序列簡單的類:

public class Rule 
{ 
    public string Pattern { get; set; } 

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

而且它deserialised這樣的:

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

+0

也許我錯了,但不是那些模式等效? '\ t'或一個標籤應該給正則表達式相同的結果,不是? – Rob

+0

'用戶編輯的'。難道你不能假設,如果用戶能夠編輯'JSON'文件,他知道反斜槓需要逃脫? –

+0

@Rob這可能是真的,是的,在'\ t'的情況下,但與正則表達式的複雜性,變化越來越低 – thmshd

回答

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, @"(?<!\\)[\\](?!\\)", @"\\") ,它會做同樣的替換,但只有如果還沒有逃脫。行中的兩個後擋板未受影響。

+0

好的,所以我沒有選擇一個好例子。'\ t'實際上就像標籤一樣工作,你是對的。但是,例如,如果你用'\ .'來替換'\ t'來匹配一個句點,例如'Parse'命令就會失敗。 '1.a'。另外,例如,如果你想將模式記錄到某處(例如到控制檯)'Console.WriteLine(模式)',它將呈現給製表符。 – thmshd

+0

O.k.我懂了。如果在'string json = s.ReadToEnd();'後面加入這一行:'json = json.Replace(「\\」,「\\\\」);'?這樣''Console.WriteLine(模式)'也將工作 – Pikoh

+0

感謝Pikoh工作!有缺點的是,它適用於整個內容,我不能真正將它隔離到正則表達式模式。 – thmshd