使用 RestSharp 反序列化部分 json 内容

Deserializing partial json content with RestSharp

我正在使用 RestSharp 发出请求并将响应反序列化为 NewtonsoftJsonSerializer 的 C# 模型。我 运行 遇到了 2 个相似的 json 字符串的情况。

第一个:

{  
   "updated": "",
   "data":{
       "categories":[...],
       "products": [...]
   }
}

第二个:

{  
   "updated": "",
   "categories":[...],
   "products": [...]
}

为了反序列化第一个,我使用了以下 C# 模型:

public class Root
{
    [JsonProperty("updated")] public string Updated{ get; set; }
    [JsonProperty("data")] public Data Items{ get; set; }
}

public class Data
{
    [JsonProperty("categories")] public List<Category> Categories { get; set; }
    [JsonProperty("products")] public List<Dish> Products { get; set; }
}

public class Category{...} 

public class Dish{...}

我现在可以使用 Data class 反序列化第二个 json 字符串。但我想使用一种模型来反序列化它们。并且先反序列化 json 成 Data class 显然 returns null。基本上我只需要 categoriesproducts 列表。

我应该在我的模型中改变什么来实现它? 有什么属性可以提供帮助吗?

如果你像这样定义 class 并将 json 响应反序列化到这个 class,你可以有一个 class 但有些字段对于每个不同的响应。

public class Data
{
    [JsonProperty("updated")] public string Updated{ get; set; }
    [JsonProperty("categories")] public List<Category> Categories { get; set; }
    [JsonProperty("products")] public List<Dish> Products { get; set; }
    [JsonProperty("data")] public Data Items{ get; set; }
}

如果你不想像上面那样做,我认为你应该创建一个自定义反序列化器,如下所述: How to implement custom JsonConverter in JSON.NET?

试试这个

   var jsonParsed = JObject.Parse(json);

    Root data;

    if (jsonParsed["data"] != null)
        data = jsonParsed.ToObject<Root>();
    else
    {
        data = new Root
        {
            Updated = (string)jsonParsed["updated"],
            Items = new Data
            {
                Categories = jsonParsed["categories"].ToObject<List<Category>>(),
                Products = jsonParsed["products"].ToObject<List<Dish>>()
            }
        };
    }