【发布时间】:2019-02-28 21:40:10
【问题描述】:
我想知道是否有一个对象包含一个字段,该字段的反序列化过程依赖于另一个字段,我该如何反序列化父对象?
容器
class Container
{
public int Id { get; set; }
public object Data { get; set; } //deserialization depends on first field
}
层次结构
class FieldType1
{
public string Value { get; set; }
}
class FieldType2
{
public int Numbers { get; set; }
}
鉴于上面的例子,如果我有一个Dictionary<int,Type>,我该如何反序列化一个像下面这样作为字符串出现的对象?:
var container = new Container { Data = new FieldType1 { Value = "sata" }};
var str = JsonConvert.SerializeObject(container);
var clone = JsonConvert.DeserializeObject<Container>(str);//has dependant field on another field
正如您在上面的示例中看到的那样,我始终拥有相同的 container 类型。但一个属性不同。
更新
在这里得到一些答案后,是否可以只保留一种类型的父对象,而为第二个字段提供基本类型?
[JsonSubTypes.KnownSubType(typeof(Child1),1)]
[JsonSubTypes.KnownSubType(typeof(Child2),2)]
public abstract Child
{
}
public class Parent{
public int Id;
public Child child;
}
我可以以某种方式装饰父母知道如何反序列化它的第二个字段(类似于JsonSubTypes)吗?
总结一下,我不想为父母提供P,P1,P2..Pn 类型。
我希望有一种类型 P 用于父级,F1,F2...Fn 类型用于其第二个字段。所以当我反序列化时我只会说 JsonConvert.DeserializeObject<P> 而转换器负责哪个具体类型是第二个字段:
Parent c1=new P{ id=1,child=new Child1()};
Parent c2=new P{ id=2,child=newChild2()};
List<Parent> items=new List<Parent>{c1,c2};
var str=JsonConvert.SerializeObject(items);
var clone=JsonConvert.DeserializeObject<List<Parent>>(str);
【问题讨论】:
-
为什么不对所有值使用字符串?
-
有多少种不同的对象类型,可以从第一个字段派生?
-
已经有几个关于此的问题,包括How to implement custom JsonConverter in JSON.NET to deserialize a List of base class objects?、Deserializing polymorphic json classes without type information using json.net、Json.net serialize/deserialize derived types? 和how to deserialize JSON into IEnumerable<BaseType> with Newtonsoft JSON.NET。有没有满足你的需求?
-
我已经阅读了实现 abd 查看互联网。但在我的情况下,我希望只有一种类型的父对象,并将第二个字段保留为基类。
-
@Ralph 至少会有几十个对象 (50-90) 类型。这就是为什么我只想保留一种类型的父对象,而为第二个字段设置一个基本抽象类。
标签: c# .net-core json.net deserialization