2013-11-13 4 views
1

Итак, у меня есть класс City, который я хочу получить и хранить данные JSON.C# Получение объекта JSON

public string status { get; set; } 
    public string id { get; set; } 
    public string country { get; set; } 
    public string region { get; set; } 
    public string mainCity { get; set; } 
    public string latitude { get; set; } 
    public string longitude { get; set; } 
    public string comment { get; set; } 
    public bool wasThereAnError { get; set; } 

    public class CityResponse 
    { 
     public string status { get; set; } 
     public string Message { get; set; } 
     public List<City> result { get; set; } 
    } 

В моем приложении мне нужно запросить город с помощью ID или отобразить список городов код страны, поэтому я хочу, чтобы город, чтобы быть базовым классом.

Вот код, который я пытаюсь использовать для создания этого happe. Он находится в WebRetrieval классе

async private Task<City> GetCityInformation(string url) 
    { 
     var client = new HttpClient(); 
     var response = await client.GetAsync(new Uri(url)); 

     string result = await response.Content.ReadAsStringAsync(); 

     //var cityRootaaa = JsonConvert.DeserializeObject<City.CityResponse>(result); 
     var cityRoot = JsonConvert.DeserializeObject<City>(result); 
     return cityRoot; 
} 

    //Return City 
    async public Task<City> GetCity(string url) 
    { 
     City city = await GetCityInformation(url); 
     return city; 
    } 

А потом, когда я пытаюсь сделать объект City в классе City_Page, я использую это:

  long cityNum = Convert.ToInt64(CityID_Textbox.Text); 
      string url = "http://honey.computing.dcu.ie/city/city.php?id=" + cityNum; 


      City city = wr.GetCity(url); 
      myTextBlock1.Text = city.ToString(); 

я получаю erros о System.Threading.tasks. задача не может быть преобразована в CityApp.City.

Я действительно в тупике, и я не знаю, что делать. Сейчас код сломан, и я понятия не имею, как его исправить. Поэтому я был бы очень признателен за любую помощь в этом. Благодаря

ответ

1

Чтобы добавить к другим ответам, вы должны удалить свой оператор SerializeObject и просто десериализовать строку в объект City.

//result = JsonConvert.SerializeObject(response); 

    var city = JsonConvert.DeserializeObject<City>(result); 
+0

Я пробовал это, и он работал, но есть ошибка. Он не сохраняет никаких значений. id и все равны нулю – AndyOHart

+1

Пройдите код с отладчиком и покажите нам значение 'result' – dcastro

+0

Результат заполнен корреляцией" {\ "status \": \ "okay \", \ "result \": {\ " идентификатор \ ": 1, \" страна \ ": \" США \», \ "область \": \ "Нью-Йорк \", \ "город \": \ "Valhalla \", \ "широта \": 41.0877, \ "longitude \": - 73.7768, \ "comment \": \ "974343 обезьяны \"}} " Так что я не уверен, что пойдет не так – AndyOHart

1

Ваш метод GetCity является async, так что вы должны await это, чтобы получить City вместо Task<City>.

City city = await wr.GetCity(url); 
+0

Выполнение этой ошибки устраняет ошибку, однако мой объект City пуст, когда я запрашиваю веб-сайт. Есть идеи? – AndyOHart

2

Изменить

City city = wr.GetCity(url); 

в

City city = wr.GetCity(url).Result; 

если вы используете .NET 4.0; если вы используете 4.5, то

City city = await wr.GetCity(url); 

Кроме того, вы возвращаете CityResponse не только город; Json не выполняет десериализацию, потому что ему не хватает [] для определения массива. Если вы выполните следующие действия

 var cityResponse = new CityResponse(); 
     cityResponse.status = "okay"; 
     cityResponse.result = new List<City>(); 
     var city = new City(); 
     city.Status = "0"; 
     city.Id = "1"; 
     city.Country = "2"; 
     city.Region = "3"; 
     city.MainCity = "4"; 
     city.Latitude = "5"; 
     city.Longitude = "6"; 
     city.Comment = "7"; 
     city.WasThereAnError = false; 

     cityResponse.result.Add(city); 

     var jsonString = JsonConvert.SerializeObject(cityResponse); 

jsonString будет

"{\" Статус \ ": \" хорошо \», \ "Сообщение \": нулевой, \ "результат \": [{\ "Статус \": \ "0 \", \ "Id \": \ "1 \", \ "Страна \": \ "2 \", \ "Регион \": \ "3 \", \ "MainCity \ ": \" 4 \», \ "Широта \": \ "5 \", \ "долготу \": \ "6 \", \ "Комментарий \": \ "7 \", \ "WasThereAnError \" : false}]} "

+0

Да, это сработало, ожидая, однако, что объект City ничего не хранит в нем. Я использовал точки останова, и я ничего не вижу в этом. Id и все равно – AndyOHart

+1

Вы уверены, что возвращаетесь в City, а не в CityResponse? –

+1

@ AndyOHart см. Мой ответ. – dcastro

1

GetCity уже ожидает и должен удалять город вместо задачи.

+1

Я не могу сделать это просто вернуть город, так как он isync – AndyOHart

+1

public City GetCity (string url) { var city = GetCityInformation (url) .GetAwaiter(). GetResult(); город возвращения; } –

Смежные вопросы