2011-08-21 12 views
6

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)\/"} 

答えて

1

あなたはこの動作を変更するためにプラグインすることができますが、私はそれをしないプル要求を取ることよりも幸せだということServiceStackのJsonSerializerで利用可能な任意のフックはありません。)

クラスあなたが変更する必要があります、次のとおりです。

  • JsWriter.cs(ライン223) - Expandoで物体を検出し、あなたがそれをする方法はExpandoオブジェクトを書き込み、デリゲートを返すようにコードを挿入します。
  • JsReader(ライン42) - 私はExpandoでオブジェクトを扱うためのコードを想像して文字列の内容を読んで、バックはExpando

にそれをデシリアライズするためにはExpandoオブジェクトを検出し、デリゲートを返すようにコードを挿入 https://groups.google.com/forum/#!forum/servicestack

:辞書に似ているので、あなたは(すなわち WriteDictionary.csDeserializeDictionary.cs

あなたがこの上の任意のより多くの質問/問題がある場合ServiceStackフォーラムを使用してお気軽に導くために辞書の実装クラスを使用することができるはずです

+0

ServiceStackを使用してMonoTouchを使用して他のシステムから生成されたJSONを逆シリアル化することができれば、この特定の問題は実際に私をあまりにも傷つけることはありません。私がそれを回避することができたとしても、プルリクエストのためのコードをまとめるために私ができることを見てみましょう。私の現在のプロジェクトの両端でServiceStackを使用するとよいでしょう。 – patridge

+1

もちろん、MonoTouchで動作するServiceStackを入手するには、https:// githubにあるMonoTouchビルドを使用するだけです。com/ServiceStack/ServiceStack/tree/master/release/latest/MonoTouch – mythz

+0

これは簡単でした。私はそれを数分間で持ち運びました。私が行ったときにMonoDevelopのキーボードショートカットを再学習していなかったのは数秒でした。 – patridge

関連する問題