在web api项目中反序列化json数组

时间:2014-10-20 06:42:38

标签: c# json rest asp.net-web-api

我的控制器方法如下

public ActionResult Index()
{
    Tweets model = null;
    var client = new HttpClient();
    var task = client.GetAsync("http://localhost:33615/api/product").ContinueWith((t) =>
    {
        var response = t.Result;
        var readtask = response.Content.ReadAsAsync<Tweets>();
        readtask.Wait();
        model = readtask.Result;
    });
    task.Wait();
    return View(model.Result);
}

url以如下方式返回行:

[{"Id":1,"Name":"Honda Civic","Description":"Luxury Model 2013"},{"Id":2,"Name":"Honda Accord","Description":"Deluxe Model 2012"},{"Id":3,"Name":"BMW V6","Description":"V6 Engine Luxury 2013"},{"Id":4,"Name":"Audi A8","Description":"V8 Engine 2013"},{"Id":5,"Name":"Mercedes M3","Description":"Basic Model 2013"}]

我的推文和推文类如下:

public class Tweets
{
    public Tweet[] Result;
}
public class Tweet
{
    [JsonProperty("Name")]
    public string Name { get; set; }
    [JsonProperty("Description")]
    public string Description { get; set; }
}

我无法弄清楚我在哪里犯错。它给了我以下错误:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'RestFiddlerTest.Controllers.Tweets' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly

如何解决此问题。

2 个答案:

答案 0 :(得分:2)

我已仔细检查过您的代码,但有一些问题。 首先,根据JSon对象,我没有看到你反向序列化Json的逻辑,我猜你是否正在使用Newtonsoft.Json?

然后你有一个类Tweets,它包含一组Tweet个对象。 现在,当您创建一个小样本时,如下所示:

var dataToSerialize = new Tweets();
dataToSerialize.Result = new [] { new Tweet { Description = "Desc", Name = "Name" } };
var data = JsonConvert.SerializeObject(dataToSerialize);

这段代码的输出如下:

{"Result":[{"Id":null,"Name":"Name","Description":"Desc"}]}

这与您从WebAPI获得的输出不同。

现在,当你使用Newtonsoft.Json时,在序列化你的对象时,你可能会做这样的事情:

const string JSon = "[{\"Id\":1,\"Name\":\"Honda Civic\",\"Description\":\"Luxury Model 2013\"},{\"Id\":2,\"Name\":\"Honda Accord\",\"Description\":\"Deluxe Model 2012\"},{\"Id\":3,\"Name\":\"BMW V6\",\"Description\":\"V6 Engine Luxury 2013\"},{\"Id\":4,\"Name\":\"Audi A8\",\"Description\":\"V8 Engine 2013\"},{\"Id\":5,\"Name\":\"Mercedes M3\",\"Description\":\"Basic Model 2013\"}]";
var data = JsonConvert.DeserializeObject<Tweets>(JSon);

注意:我已将Json字符串放入字符串中,因为我没有时间编写完整的WebAPI。

现在,这不起作用,因为我输入的字符串以及控制器确实返回的字符串不是Tweets对象(请记住,您错过了{{1}在您的JSon字符串中?相反,这是一个Result个对象的数组,因此您可以更改您的代码,如下所示:

Tweet

不幸的是,您将收到完全相同的错误。那为什么呢?因为您正在尝试将对象反序列化为var data = JsonConvert.DeserializeObject<Tweet>(JSon); 类型的对象,而您的对象是Tweet类型的数组。

因此,请修改您的代码,如下所示:

Tweet

现在,您将对象反序列化为正确的类型。

enter image description here

所以,我希望这篇文章能帮到你。

亲切的问候,

答案 1 :(得分:2)

我使用了Newtonsoft.Json。

public ActionResult Index()
    {
        List<Tweet> model = null;
        var client = new HttpClient();
        var task = client.GetAsync("http://localhost:33615/api/product").ContinueWith((t) =>
        {
            var response = t.Result;
            var readtask = response.Content.ReadAsAsync<List<Tweet>>();
            readtask.Wait();
            model = readtask.Result;
        });
        task.Wait();
        return View(model);
    }