SORU
1 Mart 2011, Salı


Nasıl bir ExpandoObject ASP.NET mvc JsonResult ile döndü düzleştirmek için?

Gerçekten çalışma zamanında sunucu tarafında dinamik bir nesne derleme sırasında ExpandoObject gibi, ama sorun bu şey JSON seri hale getirme sırasında düzleştirme dışında yaşıyorum. Önce, nesneyi oluşturmak:

dynamic expando = new ExpandoObject();
var d = expando as IDictionary<string, object>;
expando.Add("SomeProp", SomeValueOrClass);

Şimdiye kadar çok iyi. MVC benim denetleyicisi içinde, o zaman bu bir JsonResult olarak göndermek istiyorum, bu yüzden:

return new JsonResult(expando);

Bu içine JSON aşağıda, tarayıcı tarafından tüketilecek sıralar:

[{"Key":"SomeProp", "Value": SomeValueOrClass}]

AMA, asıl istediğim şey bu görmek için

{SomeProp: SomeValueOrClass}

Biliyorum ben elde yapıyorum dynamic yerine ExpandoObject -- JsonResult mümkün hale dynamic özellikleri ve değerleri içine tek bir nesne (Anahtar ya da Değer işletme). ben^>ama ExpandoObject kullanmam gerekiyor bu nedenle çalışma zamanı kadar nesne istiyorum, çünkü bilmiyorumve bildiğim kadarıyla, dinamik ExpandoObject kullanmadan dynamic için bir özellik eklemek edemem.

Aracılığıyla elemek zorunda kalabilirim"", "Value" benim javascript iş, ama bu istemciye göndermeden önce anlamaya umuyordum. Anahtar Yardımlarınız için teşekkürler!

CEVAP
6 Mayıs 2011, Cuma


Ayrıca, sadece ExpandoObject için çalışan özel bir JSONConverter yapabilirsin ve sonra Javascriptserializeryapıcı örneği kaydetmek. Bu şekilde olabilir hale diziler expando kombinasyon expando nesneleri ve ... bulana kadar başka bir nesne değil almak doğru sıralanmış("u"), sonra başka bir Dönüştürücü, ya da ekleyin başka bir türü bu. Bu yardımcı olur umarım.

   using System.Web.Script.Serialization;    
   public class ExpandoJSONConverter : JavaScriptConverter
   {
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }
    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {         
        var result = new Dictionary<string, object>();
        var dictionary = obj as IDictionary<string, object>;
        foreach (var item in dictionary)
            result.Add(item.Key, item.Value);
        return result;
    }
    public override IEnumerable<Type> SupportedTypes
    {
        get { 
              return new ReadOnlyCollection<Type>(new Type[] { typeof(System.Dynamic.ExpandoObject) });
            }
    }
   }

    //Using converter
    var serializer = new JavaScriptSerializer(); 
    serializer.RegisterConverters(new JavaScriptConverter[] { new ExpandoJSONConverter()});
    var json = serializer.Serialize(obj);

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Edgar flores

    Edgar flores

    7 HAZİRAN 2006
  • LivestrongWoman

    LivestrongWo

    1 Aralık 2011
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006