6

ServiceStack JsonSerializer を取得して、ExpandoObject を辞書ではなくフラット オブジェクトとしてシリアル化することは可能ですか? おおよそこれに近いもの:

{"x":"xvalue","y":"\/Date(1313966045485)\/"}

ExpandoObject3 つの異なるシステム (.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)\/"}
4

1 に答える 1

1

ServiceStackのJsonSerializerには、この動作を変更するためにプラグインできるフックはありませんが、プルリクエストを受け取って喜んでいます;)

変更する必要があるクラスは次のとおりです。

  • JsWriter.cs(223行目)-expandoオブジェクトを検出するコードを挿入し、expandoオブジェクトを希望どおりに書き込むデリゲートを返します。
  • JsReader(42行目)-expandoオブジェクトを検出するコードを挿入し、デリゲートを返して文字列の内容を読み取り、それを逆シリアル化してexpandoに戻します

Expandoオブジェクトを処理するためのコードは辞書に似ているので、Dictionary実装クラスを使用してガイドできるはずです(つまり、 WriteDictionary.csDeserializeDictionary.cs) 。

これについて他に質問/問題がある場合は、ServiceStackフォーラムを自由に使用してください: https ://groups.google.com/forum/#!forum / servicestack

于 2011-08-22T04:25:56.020 に答える