【问题标题】:How to deserialize JSON with dependant properties?如何反序列化具有依赖属性的 JSON?
【发布时间】: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&lt;P&gt; 而转换器负责哪个具体类型是第二个字段:

 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);

【问题讨论】:

标签: c# .net-core json.net deserialization


【解决方案1】:

乍一看,我只是使用一个可以放入 SomeNameParser/Converter 类的简单函数。

伪 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。

希望你能看到一般模式。

【讨论】:

  • 确实在这种情况下我正在解决第二个字段。但是当我反序列化父级时,我只想要一种类型的父级。我如何在父级反序列化时指定其字段类型为 @987654324 @ 不派生父级。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多