2014-10-20 3 views
1

Мой метод управления заключается в следующемDeserialize JSON массив в 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-адрес возвращает строку, как follws:

[{"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

Я дважды проверил ваш код, и с ним есть несколько проблем. Прежде всего, я не вижу, чтобы ваша логика десериализовалась в 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 объекта (помните, вы пропустили Result в вашей JSon строке? Вместо этого, это массив Tweet объектов, так что вы можете изменить свой код, как в следующем:.

var data = JsonConvert.DeserializeObject<Tweet>(JSon); 

к сожалению, вы получите ту же самую ошибку так почему же потому, что вы пытаетесь десериализации вашего объекта в объект? тип Tweet, в то время как ваш объект представляет собой массив типа Tweet.

Таким образом, изменить код так:

var data = JsonConvert.DeserializeObject<Tweet[]>(JSon); 

Теперь вы десериализации ваш объект в нужный тип.

enter image description here

Так что, я надеюсь, что этот пост поможет вам.

С наилучшими пожеланиями,

1

я использовал 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); 
    } 
Смежные вопросы