一番可読性の良い、管理しやすい方法は、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 が正しいかどうかをチェックして整形する。