Не уверен, как правильно озаглавить этот вопрос, но здесь есть проблема.
public sealed class ObjectPropertySubclassTest
{
private sealed class CleverBaseClassConverter : JsonConverter<BaseClass>
{
public override bool CanWrite => false;
public override void WriteJson(JsonWriter writer, BaseClass value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override BaseClass ReadJson(JsonReader reader, Type objectType, BaseClass existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var token = JToken.ReadFrom(reader);
if (token["Components"] is JArray)
{
var collection=new CollectionClass();
serializer.Populate(token.CreateReader(), collection);
return collection;
}
else
{
if (token["Value"] is JArray)
{
var obj = new SubClass<IEnumerable<BaseClass>>();
serializer.Populate(token.CreateReader(), obj);
return obj;
}
else
{
var obj = new SubClass<object>();
serializer.Populate(token.CreateReader(), obj);
return obj;
}
}
}
}
[JsonConverter(typeof(CleverBaseClassConverter))]
private abstract class BaseClass
{
public object Value { get; set; }
}
private class SubClass<T>: BaseClass
{
public new T Value
{
get => (T) base.Value;
set => base.Value = value;
}
}
private sealed class CollectionClass : SubClass<IEnumerable<BaseClass>>
{
public IEnumerable<BaseClass> Components { get=>Value; set=>Value=value; }
public bool ShouldSerializeValue() => false;
}
[Test]
public void Test()
{
var item=new CollectionClass
{
Components=new BaseClass[] {new SubClass<string>{Value="hi"},new SubClass<int>{Value=5}, }
};
var json = JsonConvert.SerializeObject(item);
var copy = JsonConvert.DeserializeObject<CollectionClass>(json);
//why does copy.components have 4 items (2 doubling up)?
//why does copy.value have 4 items (2 doubling up) as well?
}
}
Serializaiton работает как положено, но когда я десериализую json в класс коллекции, он заканчивается 4 элементами вместо 2 (в компонентах). Я делаю что-то в корне неправильно с десериализацией? Кроме того, почему он все еще сериализует «Значение» для класса коллекции
JSON: (У меня есть конвертер json для десериализации правильного подкласса)
{"Components":[{"Value":"hi"},{"Value":5}],"Value":[{"Value":"hi"},{"Value":5}]}