C# で JSON を処理する

久しぶりに C# で JSON を処理してみたので備忘録。

JSONを処理する(現在)

ググってみたところ、使い勝手の言いパーサーがあってすこぶる楽ちんになっていた。

DynamicJson

Dynamic 型を利用しているので、C# 4.0 (Visual Studio でいうと 2010 以降かな?)が必要。

使い方も簡単。

まず上記ページからファイルをダウンロード。(今日現在の最新版 DynamicJson_1.2.0.0.zip)

解凍して中にある DynamicJson.dll を参照設定に追加するか、DynamicJson.cs を自分のプロジェクトに追加すれば使えるようになる。

今回は外部ファイルを必要としなくてもいいように DynamicJson.cs を使ってみた。
(実行時に怒られるので System.Runtime.Serialization も参照設定に追加しておきましょう。)

そしてサンプルコード。

using Codeplex.Data;

private void button1_Click(object sender, EventArgs e)
{
    string json_source = @"
        {
            ""name""   : ""磯野"",
            ""member"" : [ ""波平"", ""フネ"", ""カツヲ"", ""ワカメ"" ], 
            ""count""  : 4
        }";

    var family = DynamicJson.Parse(json_source);

    MessageBox.Show(family.name);

    foreach (var i in family.member)
    {
        MessageBox.Show(i.ToString());
    }

    MessageBox.Show(family.count.ToString());
}

「磯野」「波平」「フネ」「カツヲ」「ワカメ」「4」とそれぞれメッセージがでれば成功。

実に簡単です。
非常に楽です。

JSONを処理する(過去)

昔はもっと面倒な方法でゴリゴリやってました。

using Microsoft.JScript;
using System.CodeDom.Compiler;
using System.Reflection;

private object JScriptEval(string source)
{
    string jscript_source = @"
        package Hoge {
            public class Fuga {
                public function Eval(sourceCode: String) : Object { 
                    return eval(sourceCode);
                }
            }
        }
    ";

    CodeDomProvider cdp = new JScriptCodeProvider();
    CompilerParameters cp = new CompilerParameters();
    cp.GenerateInMemory = true;
    CompilerResults cr = cdp.CompileAssemblyFromSource(cp, jscript_source);
    Type type = cr.CompiledAssembly.GetType("Hoge.Fuga");
    object instance = Activator.CreateInstance(type);
    return type.InvokeMember("Eval", BindingFlags.InvokeMethod, null, instance, new object[] { source }); ;
}

private void button1_Click(object sender, EventArgs e)
{
    string json_source = @"
        var family = {
            ""name""   : ""磯野"",
            ""member"" : [ ""波平"", ""フネ"", ""カツヲ"", ""ワカメ"" ],
            ""count""  : 4
        };";

    JSObject family = JScriptEval(json_source) as JSObject;

    string  name = family.GetField("name", BindingFlags.Default).GetValue(null).ToString();
    MessageBox.Show(name);

    ArrayObject values = family.GetField("member", BindingFlags.Default).GetValue(null) as ArrayObject;
    foreach (var i in values)
    {
        MessageBox.Show(values[i].ToString());
    }

    int count = (int)family.GetField("count", BindingFlags.Default).GetValue(null);
    MessageBox.Show(count.ToString());
}

※参照設定に Microsoft.JScript が必要。

JScript のインスタンスをメモリ上に作成して Eval を実行する力技。
返ってくる値が JSObject なので値を取得するのも非常に手間がかかる。

しかも JSON のデータの構成がわかってないとかなりつらいし、メモリリークとかも心配。

唯一の利点は C# 4.0 じゃなくても動くことですが、探せば良いパーサがあるでしょう。
わざわざこの方法でやる必要はありませんね・・・・

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク