using System; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Umbraco.Core.Exceptions; namespace Umbraco.Core.Serialization { /// /// Provides a base class for custom implementations. /// /// The type of the converted object. internal abstract class JsonReadConverter : JsonConverter { /// /// Create an instance of objectType, based properties in the JSON object /// /// type of object expected /// The path of the current json token. /// contents of JSON object that will be deserialized /// protected abstract T Create(Type objectType, string path, 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 var jObject = JObject.Load(reader); // Create target object based on JObject var target = Create(objectType, reader.Path, jObject); Deserialize(jObject, target, serializer); return target; } protected virtual void Deserialize(JObject jobject, T target, JsonSerializer serializer) { // Populate the object properties serializer.Populate(jobject.CreateReader(), target); } /// public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotSupportedException("JsonReadConverter instances do not support writing."); } } }