我的控制器方法如下
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
如何解决此问题。
答案 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
现在,您将对象反序列化为正确的类型。
所以,我希望这篇文章能帮到你。
亲切的问候,
答案 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);
}