使用JsonConvert类反序列化对象



我有一个奇怪的问题,很困惑。我有三个班:

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反序列化为精确原始对象?

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

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

正如我所评论的,我真的不知道你想要实现什么。

我想你应该列出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类。

最新更新