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
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.
Nasıl ASP.NET basit bir Sözlük&; strin...
Sınıf JSON seri hale getirilebilir nas...
Nasıl bir sınıf özellikleri listesini ...
Nasıl bir sınıf içinde özel bir alan d...
Nasıl JavaScript ile dinamik olarak CS...