我想知道我是否有一个对象包含一个字段,该字段的反序列化过程依赖于另一个字段,如何反序列化父对象?
容器
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);
乍一看,我只是简单地使用一个简单的函数,你可以把它放到SomeNameParser/Converter类中。
Pesudo C#代码,如下所示:
var jObject = JObject.Parse(obj.Data);
switch (jObject["firstField"])
{
case "fieldType1":
return JsonConvert.DeserializeObject<string>(str);
case "fieldType2":
return JsonConvert.DeserializeObject<int>(str);
default:
Throw new Exception( make this meaningful)
}
改进
你可以让firstField的解析做一个查找来返回一个System.Type
,然后将类型传递给JsonConvert.Deserialize(obj.Data, type)
这将节省重复的JsonConvert。
希望你能看到一般模式。