【问题标题】:Deserialize Objects with JsonConvert Class使用 JsonConvert 类反序列化对象
【发布时间】:2021-04-06 13:09:21
【问题描述】:

我有一个奇怪的问题,很困惑。 我有 3 节课:

public class ProductInfo
{
    public List<PartInfo> PartInfos { get; set; }
    public string Name { get; set; }
}
public class SubProductInfo : PartInfo
{
    public ProductInfo ProductInfo { get; set; }
}
public class PartInfo
{
    public string Name { get; set; }
    public string Desc { get; set; }
}

我有一些工业产品的信息。每个产品都有一些部分和一些子产品。对于每个产品,我都有一个来自“ProductInfo”类型的对象。对于与该产品相关的每个部分,我都有一个“PartInfo”类型的对象,对于与该产品相关的每个子产品,我都有一个“SubProductInfo”类型的对象。此“ProductInfo”对象使用“JsonConvert.SerializeObject”方法序列化。 序列化信息示例:

{"PartInfos":[{"Name":"Part1","Desc":"Part1's Desc"},{"ProductInfo":{"PartInfos":[{"Name":"SubProduct1's Part1","Desc":"SubProduct1's Part1 desc"},{"Name":"SubProduct1's Part2","Desc":"SubProduct1's Part2 desc"}],"Name":"SubProduct1"},"Name":"SubProduct1 Details","Desc":"SubProduct1's Desc"}],"Name":"Product1"}

现在我想将这些 JSON 反序列化为原始对象。我用过:

JsonConvert.DeserializeObject<ProductInfo>(serializedObject)

但在反序列化中,“SubProductInfo”对象将反序列化为“PartInfo”对象。 如何将这些 JSON 反序列化为 完全 原始对象?

【问题讨论】:

  • 请提供您要反序列化的JSON。
  • 我真的不明白你想在这里做什么。 SubProductInfo 不应该是 ProductInfo 中的集合吗?
  • 这就是人们避免继承的原因。
  • 我编辑了问题。@HimBromBeere
  • 这能回答你的问题吗? Json.net serialize/deserialize derived types?

标签: c# json


【解决方案1】:

看看这个:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

当您进行序列化时,您使用的协议通常具有解决此类问题的方式,通常是通过类型提示。基本上,您的序列化产品包含告诉反序列化器在反序列化时使用哪种类型的数据。

【讨论】:

    【解决方案2】:

    就像我评论的那样,我真的不明白你想要达到的目标。

    我认为您想列出 SubProductInfo 而不是 PartInfo,因为 PartInfo 是 SubProductInfo 的基础。像这样:

    public class ProductInfo
    {
        public List<SubProductInfo> PartInfos { get; set; }
        public string Name { get; set; }
    }
    public class SubProductInfo : PartInfo
    {
        public ProductInfo ProductInfo { get; set; }
    }
    public class PartInfo
    {
        public string Name { get; set; }
        public string Desc { get; set; }
    }
    

    如果 SubProductInfo 与 PartInfo 不同,并且两者都需要成为 ProductInfo 类的一部分,则应保留单独的列表:

    public class ProductInfo
    {
        public List<PartInfo> PartInfos { get; set; }
        public List<SubProductInfo> SubProductInfos { get; set; }
        public string Name { get; set; }
    }
    public class SubProductInfo : PartInfo
    {
        public ProductInfo ProductInfo { get; set; }
    }
    public class PartInfo
    {
        public string Name { get; set; }
        public string Desc { get; set; }
    }
    

    也许你应该避免继承,它有助于可视化你的数据模型。

    编辑

    第二个选项不会(反)序列化,因为 SubProductInfo 与 ProductInfo 有循环连接。您可以将 ProductInfo 属性标记为不可序列化,并在从 json 读取后填充它。或者只是删除它,因为想要使用它的代码应该可以访问父 ProductInfo 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多