2017-04-02 247 views
0

這是類數據庫:JSON對象顯示爲空。爲什麼?

namespace vVvBot.Model 
{ 
    public class Database 
    { 
     public List<CustomCommand> CustomCommands { get; set; } 
     public List<CustomEvent> CustomEvents { get; set; } 
    } 
} 

這是自定義事件類:

namespace vVvBot.Model 
{ 
    public class CustomEvent 
    { 
     public string Name { get; set; } 
     public bool Enabled { get; set; } 
     public List<CustomCommand> Commands { get; set; } 
    } 
} 

這是類CustomCommand:

namespace vVvBot.Model 
{ 
    public class CustomCommand 
    { 
     public string Keyword { get; set; } 
     public CommandType Type { get; set; } 
     public string Message { get; set; } 
     public bool Enabled { get; set; } 
    } 
} 

這是我反序列化類序列化數據庫對象

namespace vVvBot.Data 
{ 
    public class FileJsonContext 
    { 
     public Database ReadToObject(string fileName) 
     { 
      dynamic jsonData = File.ReadAllText(fileName); 

      return JsonConvert.DeserializeObject<Database>(jsonData) ?? new Database(); 
     } 

     public void ObjectToFile(string fileName, Database database) 
     { 
      dynamic jsonData = JsonConvert.SerializeObject(database, Formatting.Indented); 

      File.WriteAllText(fileName, jsonData); 
     } 
    } 
} 

在有問題的文件,這就是我實例數據庫:

private Database _database; 
public Database Database => _database ?? (_database = JsonContext.ReadToObject("Commands.txt")); 

這個問題行是:

var messageindex = Database.CustomEvents[index].Commands.FindLastIndex(x => x.Type == CommandType.Welcome); 

它試圖完成線,但立即返回,因爲它涉及返回null。在應該調用customcommand列表的自定義事件中有一個List,以便我可以訪問該對象。不知道它爲什麼回到NULL。

JSON文件包括:

{ 
    "CustomCommands": [ 
    { 
     "Keyword": "Hello", 
     "Type": 0, 
     "Message": "World", 
     "Enabled": true 
    }, 
    { 
     "Keyword": "Test", 
     "Type": 0, 
     "Message": "test", 
     "Enabled": true 
    }, 
    { 
     "Keyword": "greeting", 
     "Type": 3, 
     "Message": "this isnt a test ", 
     "Enabled": true 
    }, 
    { 
     "Keyword": "leaving", 
     "Type": 4, 
     "Message": "Sorry to see you go ", 
     "Enabled": true 
    }, 
    { 
     "Keyword": "faq", 
     "Type": 1, 
     "Message": "This is a FAQ TEST ", 
     "Enabled": true 
    }, 
    { 
     "Keyword": "Hi", 
     "Type": 0, 
     "Message": "Hilo ", 
     "Enabled": false 
    }, 
    { 
     "Keyword": "Hi", 
     "Type": 0, 
     "Message": "Hilo ", 
     "Enabled": false 
    } 
    ], 
    "CustomEvents": [ 
    { 
     "Name": "greeting", 
     "Enabled": true 
    }, 
    { 
     "Name": "leaving", 
     "Enabled": true 
    } 
    ] 
} 
+0

在您共享的JSON字符串中,「CustomEvents」的項目沒有設置屬性「Commands」。所以當你反序列化時,沒有任何自定義事件會有命令。它將是空列表,所以當你查詢空列表時,你總是會得到NULL。 –

+0

它不是從CustomCommands中提取所有項目嗎?當在CustomEvents類中調用它時@ChetanRanpariya 我想要使用CustomCommands中的Already的值 –

+0

它不會那樣工作.... JSON反序列化不會基於其他屬性初始化屬性。它是基於JSON字符串中的值。這裏'Database'對象將具有帶有值的'CustomCommands'和'CustomEvents'屬性,但'CustomEvents'的項目在'CustomCommands'屬性中不具有值。 –

回答

0

我很久以前有這個問題,我認爲這個問題是從Unicode。 所以我爲此寫了一個函數。你可以使用它:

List<T> ToJson<T>(byte[] byteArray) where T : new() 
    { 

    MemoryStream stream = new MemoryStream(byteArray); 


    JsonSerializer se = new JsonSerializer(); 

    StreamReader re = new StreamReader(stream); 
    JsonTextReader reader = new JsonTextReader(re); 
     return se.Deserialize<List<T>>(reader); 
    } 

我用這個函數像這樣: 的toJSON(data.ToArray());

數據是一個MemoryStream。

+0

我很好奇這是如何解決屬性的問題,當屬性數據不存在於JSON字符串中時,不會被初始化。或者我根本不明白這個問題? –