我的 Controller 方法如下
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
如何解决这个问题。
请您参考如下方法:
我仔细检查了您的代码,发现其中存在一些问题。 首先,根据 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。
现在,这将不起作用,因为我输入的字符串以及您的 Controller 确实返回的字符串不是 Tweets 对象(记住您缺少 Result 在你的 JSon 字符串中?相反,这是一个 Tweet 对象的数组,所以你可以像下面这样更改你的代码:
var data = JsonConvert.DeserializeObject<Tweet>(JSon);
不幸的是,您将收到完全相同的错误。那是为什么呢?因为您试图将您的对象反序列化为 Tweet 类型的对象,而您的对象是 Tweet 类型的数组。
因此,修改您的代码如下:
var data = JsonConvert.DeserializeObject<Tweet[]>(JSon);
现在,您正在将对象反序列化为正确的类型。
所以,我希望这篇文章能对你有所帮助。
亲切的问候,
