久しぶりに C# で JSON を処理してみたので備忘録。
JSONを処理する(現在)
ググってみたところ、使い勝手の言いパーサーがあってすこぶる楽ちんになっていた。
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 じゃなくても動くことですが、探せば良いパーサがあるでしょう。
わざわざこの方法でやる必要はありませんね・・・・