2011-08-21 19 views
6

ServiceStack JsonSerializer'ın bir ExpandoObject öğesini bir sözlükten ziyade düz bir nesne olarak serileştirmesi mümkün mü? Bu kabaca yaklaşık bir şey: NET BCL JavaScriptSerializer, Newtonsoft JSON.NET ve ServiceStack JSON sunan:ServiceStack JsonSerializer kullanarak ExpandoObject nasıl serileştirilir?

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

üç farklı sistemler kullanılarak ExpandoObject JSON seri karşılaştırmak çalışıyorum.

Oldukça basit bir dinamik nesne ile başladım.

dynamic test = new ExpandoObject(); 
test.x = "xvalue"; 
test.y = DateTime.Now; 

Bu IDictionary<string, object> gibi bir ExpandoObject tedavi etmek bir serileştiriciden için daha basit görünüyor. Hem BCL hem de ServiceStack bu yolla başlıyor, sonuçta oldukça farklı yollar gidiyor. Tipik bir sınıf serileştirilecek olurdu gibi, kodda monte edilir gibi ExpandoObject olmasını tercih ediyorum

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]"] 

daha seri hale getirilmiş. add an override JavaScript serializer to the BCL system for IDictionary<string, object>. Bu, birisinin aslında bu şekilde kalması gereken IDictionary<string, object>'un bulunmadığı varsayıldığında harika çalışır.

JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); 
javaScriptSerializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJsonConverter() }); 
Console.WriteLine(javaScriptSerializer.Serialize(test)); 
// {"x":"xvalue","y":"\/Date(1313966045485)\/"} 

Ne yazık ki, hala ServiceStack en JsonSerializer aynı şekilde bir ExpandoObject tedavi etmek için bir yol gerekir. Bunu mümkün kılmak için ServiceStack sistemine nasıl bağlarım?

Güncelleme: Kullanımlarım için bir seçenek olmasa da ServiceStack anonim nesnelere iyi davranıyor gibi görünüyor.

Console.WriteLine(ServiceStack.Text.JsonSerializer.SerializeToString(new { x = "xvalue", y = DateTime.Now })); 
// {"x":"xvalue","y":"\/Date(1313980029620+0000)\/"} 

cevap

1

Orada bu davranışı değiştirmek için takın bir ServiceStack en JsonSerializer mevcut herhangi kanca değil ama ben öyle bir çekme isteği almak için çok mutlu olacağım;)

sınıfları değiştirmek gerekir şunlardır:

  • JsWriter.cs (Hat 223) - bir expando nesneyi algılamak ve onu nasıl expando nesneyi yazan bir temsilci dönmek için kodu eklemek.
  • JsReader (Hat 42) - Bir expando nesneyi algılamak ve bir dize içeriğini okumak ve bir EXPANDO geri bu serisini için bir temsilci dönmek için kodu eklemek

Bir expando nesnesi ile başa çıkmak için kod hayal https://groups.google.com/forum/#!forum/servicestack

: bir sözlüğe benzer yüzden sizi (yani WriteDictionary.cs ve DeserializeDictionary.cs)

Bu konuda daha fazla soru/sorunlar varsa ServiceStack forumu kullanmak için çekinmeyin rehberlik sözlük uygulama sınıflarını kullanmak mümkün olmalıdır

+0

MonoTouch'ı, diğer sistemlerden birinden üretilen JSON'u serileştirmek için ServiceStack'i kullanabiliyorsam, bu sorun aslında beni çok fazla incitmez. Etrafında çalışabilirsem bile, bir çekme talebi için bazı kodları bir araya getirmek için neler yapabileceğimi görmeye çalışacağım; Mevcut projemin her iki ucunda ServiceStack kullanmak güzel olurdu. – patridge

+1

ServiceStack'ı MonoTouch üzerinde çalışmak için emin olun, sadece aşağıdaki adreste bulunan MonoTouch yapısını kullanmalısınız: https: // github.com/ServiceStack/ServiceStack/ağaç/ana/sürüm/en son/MonoTouch – mythz

+0

Bu kolaydı. Onu birkaç dakika içinde çalıştırdım. MonoDevelop’te gittiğim gibi klavye kısayollarını tekrar edemezsem saniyeler olurdu. – patridge

İlgili konular