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.");
}
}
}