2013-05-18 41 views
1

我想從文本文件讀取以下示例json到使用JSON.Net解析庫的字符串。JSON正則表達式反序列化與JSON.Net

內容的C:\ TEMP \ regeLib.json

{ 
    "Regular Expressions Library": 
    { 
     "SampleRegex":"^(?<FIELD1>\d+)_(?<FIELD2>\d+)_(?<FIELD3>[\w\&-]+)_(?<FIELD4>\w+).txt$" 
    } 
} 

示例代碼,試圖解析:

Newtonsoft.Json.Converters.RegexConverter rConv = new Newtonsoft.Json.Converters.RegexConverter(); 
     using (StreamReader reader = File.OpenText(libPath)) 
     { 
      string foo = reader.ReadToEnd(); 
      JObject jo = JObject.Parse(foo);//<--ERROR 

      //How to use RegexConverter to parse?? 
      Newtonsoft.Json.JsonTextReader jtr = new Newtonsoft.Json.JsonTextReader(reader); 
      JObject test = rConv.ReadJson(jtr);//<--Not sure what parameters to provide 
      string sampleRegex = test.ToString(); 
     } 

看來我需要使用轉換器,我知道上面的代碼是錯了,但我找不到任何描述如何/如果可以完成的例子。是否可以使用JSON.Net從文本文件讀取正則表達式標記到字符串?任何幫助表示讚賞。

UPDATE:

發揮它更多,想通了,我不得不逃離字符類,一旦我做出了修正下面我能夠解析到一個JObject和使用LINQ查詢的正則表達式模式。

更正內容C:\ TEMP \ regeLib.json

{ 
    "Regular Expressions Library": 
    { 
     "SampleRegex":"^(?<FIELD1>\\d+)_(?<FIELD2>\\d+)_(?<FIELD3>[\\w\\&-]+)_(?<FIELD4>\\w+).txt$" 
    } 
} 

更正代碼

using (StreamReader reader = File.OpenText(libPath)) 
     { 
      string content = reader.ReadToEnd().Trim(); 
      JObject regexLib = JObject.Parse(content); 
      string sampleRegex = regexLib["Regular Expressions Library"]["SampleRegex"].ToString(); 

      //Which then lets me do the following... 
      Regex rSampleRegex = new Regex(sampleRegex); 

      foreach (string sampleFilePath in Directory.GetFiles(dirSampleFiles, "*")) 
      { 
      filename = Path.GetFileName(sampleFilePath); 
      if (rSampleRegex.IsMatch(filename)) 
      { 
       //Do stuff... 
      } 
      } 
     } 

不知道這是最好的方法,但它似乎對我的情況下工作。

回答

0

我不明白你爲什麼必須在json文件中存儲這樣一個小正則表達式,你打算在未來擴展正則表達式嗎?

如果是這樣,而不是做這個

JObject regexLib = JObject.Parse(content); 
string sampleRegex = regexLib["Regular Expressions Library"]["SampleRegex"].ToString(); 

考慮使用json2csharp,使階級,至少它是強類型,使之更易於維護。

我覺得更合適的JSON是這樣的(假設):

{ 
    "Regular Expressions Library": [ 
     { 
      "SampleRegex": "^(?<FIELD1>\\d+)_(?<FIELD2>\\d+)_(?<FIELD3>[\\w\\&-]+)_(?<FIELD4>\\w+).txt$" 
     }, 
     { 
      "SampleRegex2": "^(?<FIELD1>\\d+)_(?<FIELD2>\\d+)_(?<FIELD3>[\\w\\&-]+)_(?<FIELD4>\\w+).txt$" 
     } 
    ] 
} 

這將更有意義,這種方式來存儲一個正則表達式中的「設置」文件