使用 JsonConvert 类反序列化对象

时间:2021-04-06 13:09:21

标签: c# json

我有一个奇怪的问题,很困惑。 我有 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 反序列化为完全原始对象?

2 个答案:

答案 0 :(得分:0)

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

我认为您想要制作一个 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 类。

答案 1 :(得分:0)

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

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