其他分享
首页 > 其他分享> > CodeGo.net>如何反序列化具有相关属性的JSON?

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