使用RestSharp麻烦反序列化JSON

时间:2018-06-28 14:12:43

标签: c# .net json 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格式。 那么我该如何解决呢?

预先感谢

2 个答案:

答案 0 :(得分:0)

您可以注释您的产品类以告诉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>,其中包含两个正确填充的条目。


后代的原始答案:

我还没有Restrestp的答案(但是),如果可以使用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);

答案 1 :(得分:0)

我认为您的反序列化实际上应该是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字符串为类型为Product的数组/列表。 / p>