一番可読性の良い、管理しやすい方法は、JSON のフォーマットと同じ項目を持つ『クラス』を作成して一括変換する方法です。JSON の中の階層は、そのまま実装するクラスの中で配列にしたり、さらに細かいクラスを作成して対応します。 手っ取り早い方法は、JObject にパースして、JavaScript 内で参照する方法と同じ書式で参照します。いずれにしても、JavaScript との連携になる場合も考えて、どちらを使うかを決定すればいいと思います。 テスト用 JSON
{ "id": 91500526, "simple_array": [1,2,3,4,5], "object_array": [ {"high":1,"middle":2,"low":3}, {"high":21,"middle":22,"low":23}, {"high":31,"middle":32,"low":33} ], "object_data": {"sworc":"lightbox"}, "profile_background_tile": false, "notifications": false, "profile_sidebar_fill_color": "FFF7CC", "location": "\u5927\u962a\u5e9c", "screen_name": "sworc", "profile_image_url": "http:\/\/a0.twimg.com\/profile_images\/2388651010\/zmq5cwm5nsvngpfrtr3f_normal.png" }
クラスを使った一括変換 元々の JSON に合うフォーマットのクラスを事前に作成して、JsonConvert.DeserializeObject<クラス名>(文字列); で変換します。後は、クラスとして参照するだけです。 Serializing Collections,Deserializing Collections,Deserializing Dictionaries JObject を使った参照 JObject jo = JObject.Parse(文字列); を実行して、jo を使って参照します。実際の JavaScript と同様の ["文字列"] 形式でプロパティを参照して行きます
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using Newtonsoft.Json.Linq; using Newtonsoft.Json; namespace Json130906 { class Program { static string hl = "-----------------------------------------------------"; static string json = null; static void Main(string[] args) { // 処理全体を簡単に try 〜 catch する為に JsonTest jt = new JsonTest(); try { jt.Test(); Console.WriteLine(hl); Console.ReadLine(); // ****************************************** // クラスを使った一括変換 // ****************************************** MyJson data = JsonConvert.DeserializeObject<MyJson>(json); Console.WriteLine(data.id.ToString()); Console.Write( "{0}:{1}:{2}:{3}:{4}\n{5}:{6}:{7}\n{8}:{9}:{10}\n{11}:{12}:{13}\n", data.simple_array[0].ToString(), data.simple_array[1].ToString(), data.simple_array[2].ToString(), data.simple_array[3].ToString(), data.simple_array[4].ToString(), data.object_array[0].high.ToString(), data.object_array[0].middle.ToString(), data.object_array[0].low.ToString(), data.object_array[1].high.ToString(), data.object_array[1].middle.ToString(), data.object_array[1].low.ToString(), data.object_array[2].high.ToString(), data.object_array[2].middle.ToString(), data.object_array[2].low.ToString() ); Console.WriteLine(data.object_data["sworc"]); Console.WriteLine(data.profile_background_tile); Console.WriteLine(data.notifications); Console.WriteLine(data.profile_sidebar_fill_color); Console.WriteLine(data.location); Console.WriteLine(data.screen_name); Console.WriteLine(data.profile_image_url); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.WriteLine(hl); Console.WriteLine("処理を終了しました"); Console.ReadLine(); } // ****************************************** // 処理用クラス // ****************************************** private class JsonTest { public void Test() { // 簡単なエントリと、単純配列と、オブジェクト配列を含んだ JSON string url = "http://toolbox.winofsql.jp/json/sample1.json"; // HTTP でのアクセス WebClient wc = new WebClient(); // UTF-8 として取得 wc.Encoding = Encoding.UTF8; // 文字列として取得 json = wc.DownloadString(url); // コマンドプロンプト上に表示して一旦停止 Console.WriteLine(json); Console.WriteLine(hl); Console.ReadLine(); // ****************************************** // 文字列から JObject を作成 // ****************************************** JObject jo = JObject.Parse(json); // JProperty で 一覧表示 foreach (JProperty jp in jo.Properties()) { // 下位にデータがある場合は、Array または Object と表示されます Console.WriteLine("タイプ : " + jp.Value.Type.ToString()); // 一番上位レベルに対する値を文字列で表示 Console.WriteLine(jp.Name + " --> " + jp.Value.ToString()); } // コマンドプロンプト上で一旦停止 Console.WriteLine(hl); Console.ReadLine(); string[] key = { "id","simple_array","object_array","object_data", "profile_background_tile", "notifications", "profile_sidebar_fill_color", "location", "screen_name", "profile_image_url" }; // JObject でキーを指定して直接参照 foreach (string value in key) { Console.WriteLine(jo[value].ToString()); } // コマンドプロンプト上で一旦停止 Console.WriteLine(hl); Console.ReadLine(); // ****************************************** // 下位階層単純配列の直接参照 // ****************************************** Console.WriteLine(jo["simple_array"][0].ToString()); Console.WriteLine(jo["simple_array"][1].ToString()); Console.WriteLine(jo["simple_array"][2].ToString()); Console.WriteLine(jo["simple_array"][3].ToString()); Console.WriteLine(jo["simple_array"][4].ToString()); // ****************************************** // 下位階層オブジェクト配列の直接参照 // ****************************************** Console.WriteLine(jo["object_array"][0]["high"].ToString()); Console.WriteLine(jo["object_array"][0]["middle"].ToString()); Console.WriteLine(jo["object_array"][0]["low"].ToString()); Console.WriteLine(jo["object_array"][1]["high"].ToString()); Console.WriteLine(jo["object_array"][1]["middle"].ToString()); Console.WriteLine(jo["object_array"][1]["low"].ToString()); Console.WriteLine(jo["object_array"][2]["high"].ToString()); Console.WriteLine(jo["object_array"][2]["middle"].ToString()); Console.WriteLine(jo["object_array"][2]["low"].ToString()); // ****************************************** // 下位階層オブジェクト直接参照 // ****************************************** Console.WriteLine(jo["object_data"]["sworc"].ToString()); } } // ****************************************** // 一括変換用のクラス // ****************************************** private class MyJson { public int id { get; set; } public int[] simple_array { get; set; } public Object_Array[] object_array { get; set; } public JObject object_data { get; set; } public string profile_background_tile { get; set; } public string notifications { get; set; } public string profile_sidebar_fill_color { get; set; } public string location { get; set; } public string screen_name { get; set; } public string profile_image_url { get; set; } } private class Object_Array { public int high { get; set; } public int middle { get; set; } public int low { get; set; } } } }
Json.NET ダウンロード ドキュメント ダウンロードしたファイルを解凍するとバイナリがフォルダ毎に別れています。プロジェクトの中にフォルダを作成して、その中へ既存のファイルとして呼び込んでから、そのパスで参照します。-Net45: .NET latest (4.5) -Net40: .NET 4.0 -Net35: .NET 3.5 -Net20: .NET 2.0 -WinRT: Windows 8 Store -Portable45: .NET 4.5, Windows Phone 8, Windows 8 Store -Portable40: .NET 4.0, Windows Phone 7, Windows 8 Store, Silverlight 4関連する記事 JSONLint サービスを使って、JSON が正しいかどうかをチェックして整形する。
タグ:JSON
|
【VS(C#)の最新記事】
- Replit : cs-list
- C# : Excel の新しいブックのデフォルトのシートのセルに直接値をセットして、オートフィルを Range オブジェクトから実行する
- C#( Form ) : ウインドウ枠の無い吹き出しの作成
- C# のタプル( Visual Studio 2017 でテスト )
- C# : インターネット上の JSON ファイルのフォーマットを クラスとして定義して1行でオブジェクト化して使用する
- C# の文法的文字列処理
- C# : System.Data.Odbc によるデータベースのテーブルからのデータ取得処理( サンプルの SQL は MySQL 用です )
- C# : Excel を データベースとして DataGridView に読み込む
- C# : dynamic 型 による Excel へのアクセス
- C# : フォームを表示せずに、通知領域にアイコンを表示させる常駐プログラム
- Microsoft Access に対してSQLを入力してその結果を DataGridView に表示する最も簡単なコード
- C# : System.Data.Odbc データ取得(SELECT)処理( MySQL ) : ※ using 無し( Dispose 実行 )
- C# : SQL 文を外部テキストにして、String.Format でデータ部分を置き換えて利用する
- C# コンソールアプリを AN HTTPD で実行
- C# : SQLServer( SQLExpress ) の SMO を使用してテーブルの CREATE TABLE 文 を取得する
- C# : DataGridView に TKMP.DLL の IMAP(POP3) で受信したメールを非同期に表示する( 添付ファイルも取得 )
- C# : TKMP.DLLを使った、メール送信テンプレート
- C# と VB.net : TKMP.DLL を使って IMAP でメール本文の一覧を取得する( コンソール )
- C# でDataTable と DataSource を使用して、DataGridView にデータを表示するテンプレート( 行をダブルクリックしてダイアログを表示して行データを処理 )
- (C#) / VS2010 または VS2012 : TKMP.DLL(3.1.2 または 3.1.8)を使った、『さくらインターネット』用メール送信テンプレート