2017-09-21 8 views
0

"Country"と "Data"の2つのオブジェクトを持つJSONファイルがあります。 "Data"オブジェクトをデータテーブル "sortedFileData"に非直列化しようとしていますが、whileループの内側からデータテーブルにアクセスできませんでした。私は新しいクラス(C#: access variable in the inner scope from the outer scope)を作成する方法を解決する方法を見つけましたが、ここではこれをやっていません。C#外部スコープからのデータテーブルへのアクセス

 using (FileStream fs = new FileStream(selectedProject, FileMode.Open, FileAccess.Read)) 
     using (StreamReader sr = new StreamReader(fs)) 
     using (JsonTextReader reader = new JsonTextReader(sr)) 
     { 
      DataTable sortedFileData = new DataTable(); 
      while (reader.Read()) 
      { 
       if (reader.TokenType == JsonToken.StartObject) 
       { 
        // Load each object from the stream and do something with it 
        JObject obj = JObject.Load(reader); 
        System.Windows.MessageBox.Show((string)obj["Country"]); 
        DataTable sortedFileData = JsonConvert.DeserializeObject<DataTable>((string)obj["Data"]); 
       } 
      } 
     } 

     string sorted = "Name ASC, Age ASC, Date ASC"; 
     DataView dtView = new DataView(sortedFileData) {Sort = sorted}; 

サンプルJSON:

{ 
 
    "Country": "England", 
 
    "Data": [ 
 
    { 
 
     "Name": "Bill", 
 
     "Age": "70", 
 
     "Date": "2015-05-27" 
 
    }, 
 
    { 
 
     "Name": "Sara", 
 
     "Age": "36", 
 
     "Date": "2015-01-21" 
 
    }, 
 
    { 
 
     "Name": "Bob", 
 
     "Age": "7", 
 
     "Date": "2011-05-24" 
 
    } 
 
    ] 
 
}

+2

whileループの外側(おそらく 'DataTable sortedPlotFileData = new DataTable();の代わりに/の近く)に' List 'を作成し、whileループの内側にこのテーブルを追加できますか? –

+0

質問を詳しく教えてください。あなたは 'sortedPlotFileData'を' sortedFileData'に脱塩しようとしていますか? – HEGDE

+0

申し訳ありませんが、私はそれを逃した。上記の質問を編集して例をさらに単純化しました。 – ctalley5

答えて

2

あなたはそれがループの外で宣言し、同じ場所に割り当てることができます。

DataTable sortedFileData; 

    using (FileStream fs = new FileStream(selectedProject, FileMode.Open, FileAccess.Read)) 
    using (StreamReader sr = new StreamReader(fs)) 
    using (JsonTextReader reader = new JsonTextReader(sr)) 
    { 
     while (reader.Read()) 
     { 
      if (reader.TokenType == JsonToken.StartObject) 
      { 
       // Load each object from the stream and do something with it 
       JObject obj = JObject.Load(reader); 
       System.Windows.MessageBox.Show((string)obj["Country"]); 
       sortedFileData = JsonConvert.DeserializeObject<DataTable>((string)obj["DataTable1"]); 
      } 
     } 
    } 

    string sorted = "Name ASC, Age ASC, Date ASC"; 
    if (sortedFileData != null) 
    { 
     DataView dtView = new DataView(sortedFileData) {Sort = sorted}; 
    } 

次に、すべてが期待どおりに行われたことを確認するために、簡単なヌルチェックを実行できます。

+0

ありがとう、これはトリックでした!これをやろうと思っている人のために、私は追加したい:((文字列)obj ["DataTable1"]); "配列を文字列に変換できません"というエラーが表示され続けたので、(obj ["DataTable1"] ToString())に変更しなければなりませんでした。 – ctalley5

関連する問題