2017-04-02 7 views
0

これは、クラスのデータベースです:JSONオブジェクトがNullとして表示されます。どうして?

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

これはCustomEventのためのクラスです:これはクラスCustomCommandある

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

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リストを呼び出すべきカスタムイベントのリストがあります。なぜそれが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"の項目にはプロパティ "コマンド"が設定されていません。したがって、デシリアライズすると、カスタムイベントのいずれもコマンドを持たないでしょう。空のリストになるので、空のリストを照会すると常にNULLが返されます。 –

+0

CustomCommandsからすべての項目を取得できませんか? CustomEventsクラスで呼び出すとき@ChetanRanpariya 既にCustomCommandsにある値を使用したい場合 –

+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文字列に全く存在しないときに、プロパティの初期化が行われないという問題を解決する方法が不思議です。あるいは、私は問題を全く理解していませんでしたか? –

関連する問題