2017-10-22 6 views
0
public void NestedDictIteration(Dictionary<string,object> nestedDict) 
{ 
    foreach (string key in nestedDict.Keys) 
    { 
     Console.WriteLine(key); 
     object nextLevel = nestedDict[key]; 
     if(nextLevel == null) 
     { 
      continue; 
     } 
     NestedDictIteration((Dictionary<string, object>)nextLevel); 
    } 
} 

最後のステートメントの再帰呼び出しで無効なキャストエラーが発生し続けます。これは私が見るエラーです: "タイプ 'System.String'のオブジェクトを 'System.Collections.Generic.Dictionary`2 [System.String、System.Object]'とタイプすることができません。"これを解決する最善の方法は何ですか? nextLevelの.ToDictionaryを呼び出すことができませんでした。DFS Traversalオブジェクトからディメンションキャストエラーへ

+1

何を辞書に値として保存していますか?あなたは 'object'値が' Dictionary 'だと仮定しているようですが、実際には' string'です。 –

+0

ディクショナリは、再帰的にトラバースしようとしている逆シリアル化されたJSONを表します。値の型は変更されます。文字列はフィールド名を表し、オブジェクトはトラバースする必要がある値またはネストされたオブジェクトを表します。 – afkjlkdo7635

答えて

0

あなたの辞書やネストされた辞書の中には、タイプがDictionary<string,object>ではないことが既に予想されていると思います。そうしないと、コードが無限ループに陥るため、辞書の値がすべてタイプDictionary<string,object>。したがって、あなたはその型の値ではないと辞書に直面している場合には、再帰を継続しないことがあります。

public void NestedDictIteration(Dictionary<string,object> nestedDict) 
{ 
    foreach (string key in nestedDict.Keys) 
    { 
     Console.WriteLine(key); 
     var nextLevel = nestedDict[key]; 
     if(nextLevel == null) 
     { 
      continue; 
     } 
     else (nextLevel is Dictionary<string, object>) 
     { 
      NestedDictIteration((Dictionary<string, object>)nextLevel); 
     } 
    } 
} 
0
NestedDictIteration((Dictionary<string, object>)nextLevel); 

この行はnextLevelの値がDictionary<string,object>ではないので失敗しますが、その代わりstring。文字列は辞書を表すJSONオブジェクトですが、直接キャストは、キャストしたオブジェクトが指定された型であるか、指定された型に変換可能な場合にのみ機能します(たとえばintdoubleにキャストできます) 。

この場合、JSON文字列としてデータが格納されているため、再帰する前にデータをDictionary<string,object>にデシリアライズする必要があります。この直列化復元はどのように行われているJSONオブジェクト内のデータのフォーマットに依存しますが、コードは次のようになります:あなたはJSONオブジェクトをデシリアライズするためにJson.NET図書館で見ることができ

public void NestedDictIteration(Dictionary<string,object> nestedDict) 
{ 
    foreach (string key in nestedDict.Keys) 
    { 
     Console.WriteLine(key); 
     object nextLevel = nestedDict[key]; 
     if(nextLevel == null) 
     { 
      continue; 
     } 
     var nextDictionary = JsonConvert.Deserialize<Dictionary<string,object>>(nextLevel); 
     NestedDictIteration((Dictionary<string, object>)nextLevel); 
    } 
} 

を。

関連する問題