久しぶりに 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 じゃなくても動くことですが、探せば良いパーサがあるでしょう。
わざわざこの方法でやる必要はありませんね・・・・
