SORU
8 Temmuz 2009, ÇARŞAMBA


Javascriptserializeryapıcı.Değiştirmek için nasıl serisi - alan adları

ÖzetNasıl bir alan adı için JSON veri bir alan adını göster .Net Javascriptserializeryapıcı kullanırken nesne.Serisini ?

Uzun versiyonuAşağıdaki JSON veri server API (kodlanmış Değil .bana geri dönüyor Net)

{"user_id":1234, "detail_level":"low"}

Aşağıdaki C# nesne:

[Serializable]
public class DataObject
{
    [XmlElement("user_id")]
    public int UserId { get; set; }

    [XmlElement("detail_level")]
    public DetailLevel DetailLevel { get; set; }
}

Nerede DetailLevel "Düşük" değerlerden biri olarak. bir numaralama.

Bu test başarısız:

[TestMethod]
public void DataObjectSimpleParseTest()
{
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    DataObject dataObject = serializer.Deserialize<DataObject>(JsonData);

    Assert.IsNotNull(dataObject);
    Assert.AreEqual(DetailLevel.Low, dataObject.DetailLevel);
    Assert.AreEqual(1234, dataObject.UserId);
}

Ve son iki iddia başarısız, bu alanlardaki veri yok beri. Eğer değiştirirsem JSON veri

 {"userid":1234, "detaillevel":"low"}

Geçer o zaman. Ama sunucu davranışları değiştiremem, ve istemci sınıflar C# deyim iyi adlandırılmış özellikleri olsun istiyorum. SERİ bu Silverlight dışında çalışmak istiyorum beri JSON için kullanamam. Etiketler etkisizdir XmlElement gibi görünüyor. İlgili değildiler fikri nereden aldığımı bilmiyorum, muhtemelen değildir.

Nasıl Javascriptserializeryapıcı alan adı eşleme yaparsınız? Tüm bu yapılabilir mi?

CEVAP
10 Temmuz 2009, Cuma


Bir deneyin, DataContractJsonSerializer sınıfını kullanarak aldım. Bu çözer:

Kod bu gibi görünüyor:

using System.Runtime.Serialization;

[DataContract]
public class DataObject
{
    [DataMember(Name = "user_id")]
    public int UserId { get; set; }

    [DataMember(Name = "detail_level")]
    public string DetailLevel { get; set; }
}

Ve test

using System.Runtime.Serialization.Json;

[TestMethod]
public void DataObjectSimpleParseTest()
{
        DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataObject));

        MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(JsonData));
        DataObject dataObject = serializer.ReadObject(ms) as DataObject;

        Assert.IsNotNull(dataObject);
        Assert.AreEqual("low", dataObject.DetailLevel);
        Assert.AreEqual(1234, dataObject.UserId);
}

Tek dezavantajı bir dize için bir numaralama gelen DetailLevel değiştirmek zorunda kaldım Bu yerlerde numaralama türünü devam edersen, use datacontractjsonserializer sayısal bir değer okumasını ve başarısız olur. Daha fazla ayrıntı için DataContractJsonSerializer and Enums bkz.

Bence bu özellikle Javascriptserializeryapıcı doğru işler oldukça kötü. Bu bir sıralama içine bir dize ayrıştırmak için çalışıyor olsun istisna

System.Runtime.Serialization.SerializationException: There was an error deserializing the object of type DataObject. The value 'low' cannot be parsed as the type 'Int64'. --->
System.Xml.XmlException: The value 'low' cannot be parsed as the type 'Int64'. --->  
System.FormatException: Input string was not in a correct format

Ve bu gibi numaralama işaretleme bu davranışı değiştirmez:

[DataContract]
public enum DetailLevel
{
    [EnumMember(Value = "low")]
    Low,
   ...
 }

Bu da Silverlight iş gibi görünüyor.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MC JIN'S OLD YouTube CHANNEL

    MC JIN'S OLD

    2 Kasım 2008
  • Damian Winter

    Damian Winte

    27 ŞUBAT 2007
  • Khan Academy

    Khan Academy

    17 Kasım 2006