2015-06-18 47 views
0

我正在嘗試使用Json.NET製作配置讀取器類。C# - Json.NET配置?

這裏的類:

public sealed class ConfigFile : Dictionary<string, object> 
    { 
     public string FileName { get; private set; } 

     public ConfigFile(string fileName) 
     { 
      this.FileName = fileName; 

      this.Load(); 
     } 

     private void Load() 
     { 
      string contents = File.ReadAllText(this.FileName); 

      JsonTextReader reader = new JsonTextReader(new StringReader(contents)); 

      string lastKey = ""; 

      while (reader.Read()) 
      { 
       if (reader.TokenType == JsonToken.PropertyName) 
       { 
        lastKey = reader.Value.ToString(); 
       } 
       else 
       { 
        if (this.ContainsKey(lastKey)) 
        { 
         continue; 
        } 

        this.Add(lastKey, reader.Value); 
       } 
      } 
     } 

它工作得很好。但是,它會逐行讀取。這意味着如果我有一個像列表一樣的對象,它不會正確解析它。

我有幾個問題。

  1. Json.NET的Deserializer如何知道如何正確讀取.json文件並將其轉換爲正確的類型?我怎樣才能模仿我班上的同一行爲?
  2. 如何在我的類中使用JSON.Net Deserializer中使用的相同閱讀行爲,以便我可以正確讀取配置文件?

謝謝。

回答

0

那麼我強烈建議挖掘Newtonsoft.Json的來源。 您似乎在尋找的動作採用ReadInternal方法和以下Parse*方法。 請看一看here

當然,你可以通過閱讀代碼學到很多東西,看起來像finite state machine主要是抽象,使處理對象閱讀和寫作。

+0

我已通過調用Read來使用ReadInternal。但是,就像我說的那樣,它逐行讀取,這不是我正在尋找的。我想要在JsonConvert.DeserializeObject 中使用相同的行爲,以便它可以讀取所有內容並將其添加到字典中,而不是將其分配給T. –

+0

您可以實現自己的貪婪邏輯。加載所有內容並解析整個片段。仍然沒有得到你的問題是什麼?原始的源代碼足以對所有的邏輯進行逆向工程,不是嗎? –