2015-06-18 19 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

您可以实现自己的贪婪逻辑。加载所有内容并解析整个片段。仍然没有得到你的问题是什么?原始的源代码足以对所有的逻辑进行逆向工程,不是吗? –