代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

如何使用依赖属性反序列化json?

  •  0
  • Bercovici Adrian  · 技术社区  · 6 年前

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

    集装箱

    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);
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Ralph Willgoss    6 年前

    乍一看,我只需要使用一个简单的函数 SomeNameParser/转换器 上课。

    比苏多代码,类似于:

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

    改进
    您可以对 第一场 执行查找以返回 System.Type ,然后将类型传递给 JsonConvert.Deserialize(obj.Data, type) 这将节省重复的JsonConvert。

    希望你能看到大致的模式。