JSON 文字列を Json.NET で一行でデシリアライズします。その際、バインド用の ObservableCollection に直接セットするので、DataGrid には、DataContext にセットするだけで、表示用の列と行は自動作成されます
外部ライブラリ
JSON データの扱いには、Json.NET を使用します。ダウンロードして、Bin フォルダにある自分の環境に該当するフレームワークフォルダを ソリューションの中に置いて参照設定を行います。
※ net45 フォルダをコピーして使用しました / VS2012
JSON データ
https://lightbox.sakura.ne.jp/demo/json/syain_json.php
このデータを扱う為に以下のクラスを作成しています
Syain.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WpfAppDataGridFromWeb {
class Syain {
public string 社員コード { get; set; }
public string 氏名 { get; set; }
public string フリガナ { get; set; }
public string 所属 { get; set; }
private string _性別;
public string 性別 {
get {
if (this._性別 == "0") {
return "男";
}
else {
return "女";
}
}
set {
this._性別 = value;
}
}
public int 給与 { get; set; }
public int? 手当 { get; set; }
public string 管理者 { get; set; }
public string 作成日 { get; set; }
public string 更新日 { get; set; }
}
}
画面
デフォルトで True になっていますが、バインドで列を自動作成させる為に 『AutoGenerateColumns="True"』を DataGrid に設定しています
<Window
x:Class="WpfAppDataGridFromWeb.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="857.456"
Width="1191.774">
<Grid>
<Button
Content="Button"
HorizontalAlignment="Left"
Height="24"
Margin="27,29,0,0"
VerticalAlignment="Top"
Width="122"
Click="Button_Click" />
<DataGrid
x:Name="dataGrid"
HorizontalAlignment="Left"
Height="720"
Margin="27,71,0,0"
VerticalAlignment="Top"
Width="1124"
ItemsSource="{Binding}"
IsReadOnly="True"
MouseDoubleClick="dataGrid_MouseDoubleClick" />
</Grid>
</Window>
処理
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.Odbc;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfAppDataGridFromWeb {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
// ウインドウを中央へ
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
}
private void Button_Click(object sender, RoutedEventArgs e) {
dataGrid.Columns.Clear();
Console.WriteLine("クリックされました");
Console.WriteLine(Directory.GetCurrentDirectory());
string url = "https://lightbox.sakura.ne.jp/demo/json/syain_json.php";
string result = "[\"error\"]";
// 信頼性のある WebClient で インターネットアクセス
WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.UTF8;
try {
// 読み込み
result = wc.DownloadString(url);
}
catch( Exception ex) {
Console.WriteLine("WebClient エラー:" + ex.ToString());
}
// JSON オブジェクト配列 Newtonsoft.Json( net45 )
ObservableCollection<Syain> syain_data = JsonConvert.DeserializeObject<ObservableCollection<Syain>>(result);
// DataGrid にバインド
dataGrid.DataContext = syain_data;
}
// DataGrid をダブルクリックした時の行データの取得
private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
int row = dataGrid.SelectedIndex;
if ( row >= 0 ) {
Syain syain = (Syain)dataGrid.Items.GetItemAt(row);
Debug.WriteLine(syain.社員コード + "|" + syain.氏名);
MessageBox.Show(syain.社員コード + "|" + syain.氏名,
"確認",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
}
}
}
※ HttpClient はバグがあるという話なので使用していません。
関連する記事
Swing の JTable に 1) WEBのJSON2次元配列。2) WEB の JSON配列 を取り込んで表示する( Google Gson と okhttp を使用 )
補足
以下の例では、AutoGenerateColumns="False" に設定して、列の定義をプログラムで行っています。このほうがアプリケーションとしては、列単位で仕様を決定しやすいので自由度が増すはずです。
※ データは JSON の2次元配列を使用しています
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.Data.Odbc;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfAppDataGridFromWeb {
public partial class MainWindow : Window {
private DataGridTextColumn col;
private ObservableCollection<Syain> syain_list = null;
public MainWindow() {
InitializeComponent();
// ウインドウを中央へ
this.WindowStartupLocation = WindowStartupLocation.CenterScreen;
}
private void Button_Click(object sender, RoutedEventArgs e) {
dataGrid.Columns.Clear();
Console.WriteLine("クリックされました");
Console.WriteLine(Directory.GetCurrentDirectory());
string url = "https://lightbox.sakura.ne.jp/demo/json/syain_array.php";
string result = "[\"error\"]";
// 信頼性のある WebClient で インターネットアクセス
WebClient wc = new System.Net.WebClient();
wc.Encoding = System.Text.Encoding.UTF8;
try {
// 読み込み
result = wc.DownloadString(url);
}
catch( Exception ex) {
Console.WriteLine("WebClient エラー:" + ex.ToString());
}
// JSON 2次元配列 Newtonsoft.Json( net45 )
string[][] syain_data = JsonConvert.DeserializeObject<string[][]>(result);
// バインド用クラス
Syain syain;
// 列用
col = null;
// バインド用コレクション
syain_list = new ObservableCollection<Syain>();
foreach (string[] syain_row in syain_data) {
// 初回
if (col == null) {
foreach (string syain_col in syain_row) {
col = new DataGridTextColumn();
col.Header = syain_col;
col.Binding = new Binding(syain_col);
dataGrid.Columns.Add(col);
}
continue;
}
syain = new Syain();
syain.社員コード = syain_row[0];
syain.氏名 = syain_row[1];
syain.フリガナ = syain_row[2];
syain.所属 = syain_row[3];
syain.性別 = syain_row[4];
syain.給与 = int.Parse(syain_row[7]);
syain.手当 = (syain_row[8] == "" ? 0 : int.Parse(syain_row[8]));
syain.管理者 = syain_row[9];
syain.作成日 = syain_row[5];
syain.更新日 = syain_row[6];
// observablecollection に追加
syain_list.Add(syain);
}
//// DataGrid にバインド
dataGrid.DataContext = syain_list;
}
// DataGrid をダブルクリックした時の行データの取得
private void dataGrid_MouseDoubleClick(object sender, MouseButtonEventArgs e) {
int row = dataGrid.SelectedIndex;
if ( row >= 0 ) {
Syain syain = (Syain)dataGrid.Items.GetItemAt(row);
Debug.WriteLine(syain.社員コード + "|" + syain.氏名);
MessageBox.Show(syain.社員コード + "|" + syain.氏名,
"確認",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
}
}
}