ServiceStack JsonSerializerを使用して、ExpandoObjectを辞書ではなくフラットオブジェクトとしてシリアル化することはできますか?これとほぼ近似し何か:.NET BCL JavaScriptSerializer、Newtonsoft JSON.NET、およびServiceStackのJSON提供:ServiceStack JsonSerializerを使用してExpandoObjectをシリアル化する方法は?
{"x":"xvalue","y":"\/Date(1313966045485)\/"}
私は、3つの異なるシステムを使用してExpandoObject
のJSONのシリアル化を比較しようとしています。
私はかなり単純な動的オブジェクトから始めます。
dynamic test = new ExpandoObject();
test.x = "xvalue";
test.y = DateTime.Now;
それはIDictionary<string, object>
としてExpandoObjectを治療するために、シリアライザのためのシンプルなようです。 BCLとServiceStackの両方がこの方法で開始しますが、結果とはかなり異なるルートになります。
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
Console.WriteLine(javaScriptSerializer.Serialize(test));
// [{"Key":"x","Value":"xvalue"},{"Key":"y","Value":"\/Date(1313966045485)\/"}]
Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(test));
// ["[x, xvalue]","[y, 8/21/2011 16:59:34 PM]"]
一般的なクラスがシリアル化されるように、ExpandoObjectをコード内で組み立てたときに、より多くのコードを直列化することをお勧めします。あなたはadd an override JavaScript serializer to the BCL system for IDictionary<string, object>
です。これは、実際にはその方法をとどめておく必要があるIDictionary<string, object>
を持っていないと仮定すると、うまくいく(私はまだない)。
JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer();
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() });
Console.WriteLine(javaScriptSerializer.Serialize(test));
// {"x":"xvalue","y":"\/Date(1313966045485)\/"}
残念ながら、私はまだ同じ方法でExpandoObjectを治療するためのServiceStackのJsonSerializerを取得する方法が必要です。これを可能にするために、どのようにServiceStackシステムにフックしますか?
更新:私の用途では選択肢ではありませんが、ServiceStackは匿名オブジェクトをうまく処理するようです。
Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now }));
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"}
ServiceStackを使用してMonoTouchを使用して他のシステムから生成されたJSONを逆シリアル化することができれば、この特定の問題は実際に私をあまりにも傷つけることはありません。私がそれを回避することができたとしても、プルリクエストのためのコードをまとめるために私ができることを見てみましょう。私の現在のプロジェクトの両端でServiceStackを使用するとよいでしょう。 – patridge
もちろん、MonoTouchで動作するServiceStackを入手するには、https:// githubにあるMonoTouchビルドを使用するだけです。com/ServiceStack/ServiceStack/tree/master/release/latest/MonoTouch – mythz
これは簡単でした。私はそれを数分間で持ち運びました。私が行ったときにMonoDevelopのキーボードショートカットを再学習していなかったのは数秒でした。 – patridge