ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CodeGo.net>如何反序列化具有相关属性的JSON?

2019-12-11 03:08:09  阅读:241  来源: 互联网

标签:net-core json-net deserialization c


我想知道是否有一个对象包含一个字段,该字段的反序列化过程取决于另一个字段,我该如何反序列化父对象?

容器

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有