如何使用NewtonSoft Json将变量类型属性反序列化为类?

时间:2017-03-16 05:18:44

标签: c# json serialization json.net

如何使用NewtonSoft JSON反序列化为此类型的对象?该结构包含属性类型变量,但是使用基于此结构的NewtonSoft,此属性将是另一个类。

以下代码示例:

public class RootProduct
{
    public Package Package {get; set;}
}

public class Package
{
    //Package has a property in which the class type should be changed in order to deserialize
    public Package_id ThisValueIsVariable {get; set;}
}

public class Package_id
{
    public string product_name {get; set;}
}

在这个包的数据查询中,有必要发送Package_id,在下面的结构中收到此查询的返回,字段“Package_id”(以JSON形式返回)是在查询中发送的此代码。 / p>

返回JSON:

"Package": {
   "Package_id": { //This is the value that changes according to the value passed in the query to JSON
       "package_name": "my product name"
   }
 }

"Package": {
   "SecondPackage_id": { //This is the value that changes according to the value passed in the query to JSON
      "package_name": "my product name"
   }
 }

"Package": {
      "ThirdPackage_id": { //This is the value that changes according to the value passed in the query to JSON
          "package_name": "my product name"
      }
 }

更新:

在上面的代码中,只有第一个产品将被反序列化,因为只有一个类名为“package_id”,第二个和第三个JSON项不会使用JsonConvert.Deserialize反序列化,因为SecondPackage_id类不存在连续

1 个答案:

答案 0 :(得分:1)

解决方案取决于您是否在运行时之前知道名称。

如果您事先知道可能的名称,可以为Package类中的每个类型创建一个单独的属性,如下所示:

public class Package
{
    public Package_id FirstPackage {get; set;}
    public Package_id SecondPackage {get; set;}
    public Package_id ThridPackage {get; set;}
}

其他属性应重新序列化为null。

如果您在运行时不知道可能的ID,那么您实际上正在接收 一个关键值对。因为每个对象的键是不同的,所以技术上可能是多个(即使在你的情况下它可能只是一个)。使用字典从JSON获取(多个)命名对象

public class RootProduct
{
    //No package class needed
    public IDictionary<string, Package_id> Package {get; set;}
}

public class Package_id
{
    public string product_name {get; set;}
}