SQLの窓

2014年09月18日


VS(C#) : Json.NET を使用して文字列形式の JSON をプログラムで参照する具体的な方法

一番可読性の良い、管理しやすい方法は、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#)の最新記事】
posted by lightbox at 2014-09-18 21:47 | VS(C#) | このブログの読者になる | 更新情報をチェックする
バッチ処理

Microsoft Office
container 終わり

フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

Android SDK ポケットリファレンス
改訂版 Webデザイナーのための jQuery入門
今すぐ使えるかんたん ホームページ HTML&CSS入門
CSS ドロップシャドウの参考デモ
Google Hosted Libraries
cdnjs
BUTTONS (CSS でボタン)
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり