使用 RestSharp 反序列化 JSON 时出现问题

Trouble deserialize JSON with RestSharp

我正在尝试使用 RestSharp 反序列化来自 WooCommerce 的 JSON 响应。 我一直在抓取此站点的类似帖子,但没有找到任何解决方案。

我的JSON(简体)

[
    {
        "id":1,
        "name":"product 1",
    },
    {
        "id":2,
        "name":"product 2",
    }
]

翻译成 C# 是这样的:

public class ProductResponse
{
    public List<Product> products { get; set; }
}

public class Product
{
    public int id { get; set; }
    public string name { get; set; }
}

并这样称呼

var response = client.Execute<ProductResponse>(request);

但这不起作用,因为产品数组没有名称。 如果把JSON改成

{
    "products":
    [
        {
            "id":1,
            "name":"product 1",
        },
        {
            "id":2,
            "name":"product 2",
        }
    ]
}

它就像一个魅力。很遗憾,我无法更改 JSON 格式。 那么我该如何解决呢?

提前致谢

您可以注释您的产品 class 以告诉 RestSharp 属性 是哪个:

public class Product
{
    [DeserializeAs(Name = "id")]
    public int id { get; set; }

    [DeserializeAs(Name = "name")]
    public string name { get; set; }
}

然后:

var response = client.Execute<List<Product>>(request);

您现在应该有一个 List<Product>,其中包含两个正确填充的条目。


后人原答案:

我还没有 RestSharp 的答案(目前),但如果可以使用 Newtonsoft JSON 可以轻松实现。

您可以像这样使用 JsonProperty 注释:

public class Product
{
    [JsonProperty("id")]
    int id { get; set; }

    [JsonProperty("name")]
    string name { get; set; }
}

然后:

var products = JsonConvert.DeserializeObject<List<Product>>(json);

我认为你的反序列化实际上应该是 List<Product> 而不是 ProductResponse

例如

var response = client.Execute<List<Product>>(request);

Console.WriteLine("id = " + response[0].id)      //  id = 1  
Console.WriteLine("name = " + response[0].name)  //  name = product 1
Console.WriteLine("id = " + response[1].id)    //  id = 2
Console.WriteLine("name = " + response[1].name)  //  name = product 2

所以 JSON 字符串没有任何问题,我认为问题是您需要一个 ProductResponse 类型的对象,而您的 JSON 字符串是 array/List 类型 Product.