【发布时间】:2019-09-30 09:33:14
【问题描述】:
不确定如何正确命名这个问题,但问题就在这里。
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}]}
【问题讨论】:
-
当你改变 TypeNameHandling = TypeNameHandling.All 它将是 2,对吧?
-
是的,但为什么呢?我想最终使用自定义 json 转换器来处理子类反序列化
-
使用 TypeNameHandling.Auto 代替 TypeNameHandling.Object
-
我在这个例子中使用了类型处理来简化问题,但我想实际使用 json 转换器来决定初始化哪个子类
-
我已经用 json 转换器更新了我的问题
标签: c# json.net json-deserialization subclassing