SORU
6 Kasım 2011, Pazar


Nasıl özel JsonConverter uygulamak json.net taban sınıf nesnelerinin bir Listesini serisini?

Json.net örneğin burada verilen genişletmek için çalışıyorum http://james.newtonking.com/projects/json/help/CustomCreationConverter.html

Başka bir alt sınıf temel sınıf/Arayüzü kaynaklanan var

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class Employee : Person
{
    public string Department { get; set; }
    public string JobTitle { get; set; }
}

public class Artist : Person
{
    public string Skill { get; set; }
}

List<Person> people  = new List<Person>
{
    new Employee(),
    new Employee(),
    new Artist(),
};

Nasıl aşağıdaki Json Listesi< Kişi ^ serisini yapıyorum .

[
  {
    "Department": "Department1",
    "JobTitle": "JobTitle1",
    "FirstName": "FirstName1",
    "LastName": "LastName1"
  },
  {
    "Department": "Department2",
    "JobTitle": "JobTitle2",
    "FirstName": "FirstName2",
    "LastName": "LastName2"
  },
  {
    "Skill": "Painter",
    "FirstName": "FirstName3",
    "LastName": "LastName3"
  }
]

TypeNameHandling JsonSerializerSettings kullanmak istemiyorum. Özellikle özel JsonConverter uygulanması için bu işi arıyorum. Bu geçici belge ve örnekleri internette çok seyrek. Bu geçersiz kılınmış ReadJson elde edemiyorum() JsonConverter doğru yöntem uygulama.

CEVAP
6 Kasım 2011, Pazar


Standart CustomCreationConverter, ben mücadele için nasıl oluşturmak için doğru türü (Person Employee), çünkü tanı amacıyla, bu ihtiyacın analiz eder JSON ve orada hiçbir yerleşik bir yolu bunu yapmak için kullanma Create yöntem.

Tartışma bir iplik türü dönüştürme ilişkin buldum ve cevap vermek için döndü. Burada bir bağlantı vardır: Type converting.

İstenileni JObject bir nesne acceps JsonConverter, ReadJson yöntemi geçersiz kılma ve Create yeni soyut bir yöntem oluşturarak alt etmektir.

Sınıfı yüklemek için bir araç sağlar JObject JSON nesnesi ve provdes bu nesne içindeki verilere erişim.

ReadJson geçersiz kılınmış yöntemi JObject bir nesne oluşturur ve Create yöntem (türetilmiş dönüştürücü bizim sınıf tarafından uygulanan), JObject örnek geçen çağırır.

JObject Bu örnek, sonra belli alanları varlığına kontrol ederek doğru türünü belirlemek için analiz edilebilir.

Örnek

string json = "[{
        \"Department\": \"Department1\",
        \"JobTitle\": \"JobTitle1\",
        \"FirstName\": \"FirstName1\",
        \"LastName\": \"LastName1\"
    },{
        \"Department\": \"Department2\",
        \"JobTitle\": \"JobTitle2\",
        \"FirstName\": \"FirstName2\",
        \"LastName\": \"LastName2\"
    },
        {\"Skill\": \"Painter\",
        \"FirstName\": \"FirstName3\",
        \"LastName\": \"LastName3\"
    }]";

List<Person> persons = 
    JsonConvert.DeserializeObject<List<Person>>(json, new PersonConverter());

...

public class PersonConverter : JsonCreationConverter<Person>
{
    protected override Person Create(Type objectType, JObject jObject)
    {
        if (FieldExists("Skill", jObject))
        {
            return new Artist();
        }
        else if (FieldExists("Department", jObject))
        {
            return new Employee();
        }
        else
        {
            return new Person();
        }
    }

    private bool FieldExists(string fieldName, JObject jObject)
    {
        return jObject[fieldName] != null;
    }
}

public abstract class JsonCreationConverter<T> : JsonConverter
{
    /// <summary>
    /// Create an instance of objectType, based properties in the JSON object
    /// </summary>
    /// <param name="objectType">type of object expected</param>
    /// <param name="jObject">
    /// contents of JSON object that will be deserialized
    /// </param>
    /// <returns></returns>
    protected abstract T Create(Type objectType, JObject jObject);

    public override bool CanConvert(Type objectType)
    {
        return typeof(T).IsAssignableFrom(objectType);
    }

    public override object ReadJson(JsonReader reader, 
                                    Type objectType, 
                                     object existingValue, 
                                     JsonSerializer serializer)
    {
        // Load JObject from stream
        JObject jObject = JObject.Load(reader);

        // Create target object based on JObject
        T target = Create(objectType, jObject);

        // Populate the object properties
        serializer.Populate(jObject.CreateReader(), target);

        return target;
    }

    public override void WriteJson(JsonWriter writer, 
                                   object value,
                                   JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Bu yardımcı olur umarım.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BetterCoder

    BetterCoder

    17 Aralık 2012
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • Xbox

    Xbox

    1 Kasım 2005