CodeGo.net>如何反序列化具有相关属性的JSON?
作者:互联网
我想知道是否有一个对象包含一个字段,该字段的反序列化过程取决于另一个字段,我该如何反序列化父对象?
容器
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
如您在上面的示例中所见,我始终具有相同的容器类型.但是一个属性有所不同.
更新资料
经过一些回答之后,是否可以仅保留一种父对象类型,而对第二个字段使用基类型呢?
[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.
希望您可以看到一般模式.
标签:net-core,json-net,deserialization,c 来源: https://codeday.me/bug/20191211/2106004.html