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