ServiceStack JsonSerializer を取得して、ExpandoObject を辞書ではなくフラット オブジェクトとしてシリアル化することは可能ですか? おおよそこれに近いもの:
{"x":"xvalue","y":"\/Date(1313966045485)\/"}
ExpandoObject
3 つの異なるシステム (.NET BCL JavaScriptSerializer、Newtonsoft JSON.NET、および ServiceStack の JSON オファリング) を使用して JSON シリアル化を比較しようとしています。
かなり単純な動的オブジェクトから始めます。
dynamic test = new ExpandoObject();
test.x = "xvalue";
test.y = DateTime.Now;
シリアライザーが ExpandoObject を として扱う方が簡単に思えIDictionary<string, object>
ます。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 をコードで組み立てる際に、さらにシリアル化することをお勧めします。の BCL システムにオーバーライド JavaScript シリアライザーを追加でき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)\/"}
残念ながら、ServiceStack の JsonSerializer が ExpandoObject を同じ方法で処理できるようにする方法がまだ必要です。これを可能にするために ServiceStack システムに接続するにはどうすればよいですか?
更新:私の用途ではオプションではありませんが、ServiceStack は匿名オブジェクトを問題なく処理しているようです。
Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now }));
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"}