Skip to main content
 首页 » 编程设计

c#之反序列化web api项目中的json数组

2024年02月06日26Terrylee

我的 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); 

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

所以,我希望这篇文章能对你有所帮助。

亲切的问候,