Надеюсь, кто-то приходит (это должно быть одно), но сейчас это работает на меня:
public class RectangleListConverter : RectangleConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var rectangleList = (IList<Rectangle>)value;
var jArray = new JArray();
foreach (var rectangle in rectangleList)
{
jArray.Add(GetObject(rectangle));
}
jArray.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var rectangleList = new List<Rectangle>();
var jArray = JArray.Load(reader);
foreach (var jToken in jArray)
{
rectangleList.Add(GetRectangle(jToken));
}
return rectangleList;
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
}
мне пришлось изменить RectangleConverter
я использую: класс
public class RectangleConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var rectangle = (Rectangle)value;
var jObject = GetObject(rectangle);
jObject.WriteTo(writer);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
var jObject = JObject.Load(reader);
return GetRectangle(jObject);
}
public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}
protected static JObject GetObject(Rectangle rectangle)
{
var x = rectangle.X;
var y = rectangle.Y;
var width = rectangle.Width;
var height = rectangle.Height;
return JObject.FromObject(new { x, y, width, height });
}
protected static Rectangle GetRectangle(JObject jObject)
{
var x = GetTokenValue(jObject, "x") ?? 0;
var y = GetTokenValue(jObject, "y") ?? 0;
var width = GetTokenValue(jObject, "width") ?? 0;
var height = GetTokenValue(jObject, "height") ?? 0;
return new Rectangle(x, y, width, height);
}
protected static Rectangle GetRectangle(JToken jToken)
{
var jObject = JObject.FromObject(jToken);
return GetRectangle(jObject);
}
protected static int? GetTokenValue(JObject jObject, string tokenName)
{
JToken jToken;
return jObject.TryGetValue(tokenName, StringComparison.InvariantCultureIgnoreCase, out jToken) ? (int)jToken : (int?)null;
}
}
Анимация с новым JsonConverter
атрибутом:
public class Animation
{
[JsonProperty]
private readonly string name;
[JsonConverter(typeof(RectangleListConverter))]
[JsonProperty]
private readonly IList<Rectangle> frames;
}
возможно дубликат [Как реализовать пользовательские JsonConverter в Json.NET десериализации списка объектов базового класса] (http://stackoverflow.com/questions/8030538/how-to-implement-custom-jsonconverter-in-json-net-to-deserialize-a-list-of-base) –
Я видел, что но я не думаю, что он пытается сделать то же самое. Я могу сериализовать/десериализовать списки базовых классов без заминок, за исключением этого конкретного класса, для которого требуется собственный конвертер. –