2011-08-21 38 views
6

是否有可能讓ServiceStack JsonSerializer將ExpandoObject作爲扁平對象而不是字典序列化?大致的東西大致這樣:如何使用ServiceStack JsonSerializer序列化ExpandoObject?

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

我想比較使用三種不同的系統ExpandoObject JSON序列化:在.NET BCL JavaScriptSerializer,Newtonsoft JSON.NET和ServiceStack的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序列化得更多,因爲它是在代碼中組裝的,就像典型的類會被序列化。你可以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)\/"} 

不幸的是,我還需要一種方式來獲得ServiceStack的JsonSerializer以同樣的方式對待一個ExpandoObject。如何連接到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對象的代碼類似於字典,所以你應該能夠使用字典實現類來指導你(即WriteDictionary.csDeserializeDictionary.cs

隨意使用ServiceStack論壇,如果您有任何其他疑問/問題在此: https://groups.google.com/forum/#!forum/servicestack

+0

如果我可以讓MonoTouch使用ServiceStack反序列化從其他系統生成的JSON,那麼這個特定的問題實際上並不會對我造成太大的傷害。即使我可以解決這個問題,我也會嘗試看看我能做些什麼來爲pull請求放置一些代碼;在當前項目的兩端使用ServiceStack會很好。 – patridge

+1

當然,要讓ServiceStack在MonoTouch上工作,您只需使用可在以下網址獲得的MonoTouch版本:https:// github。com/ServiceStack/ServiceStack /樹/主/發佈/最新/ MonoTouch – mythz

+0

這很容易。我在幾分鐘內完成並運行。如果我沒有在MonoDevelop中重新學習鍵盤快捷方式,那將會是秒。 – patridge

相關問題