Заходя в данные о погоде в json - PullRequest
1 голос
/ 03 мая 2019

Я новичок в json и пытаюсь проанализировать некоторые погодные данные. Все хорошо, за исключением одной информации, которую я пытаюсь получить.

    var datas = new List<HourData>();
    HttpResponseMessage response = await client.GetAsync(_url);
    if (response.IsSuccessStatusCode)
    {
      var content = await response.Content.ReadAsStringAsync();

      JObject obj = JObject.Parse(content);

      var token = obj.SelectToken("data.weather");
      var tokenHours = (JArray)token[0].SelectToken("hourly");

      foreach (var tk in tokenHours)
      {
        var json = JsonConvert.SerializeObject(tk);
        datas.Add(JsonConvert.DeserializeObject<HourData>(json));
      }
    }

  public class HourData
  {
    public string weatherDesc { get; set; }
    public string time { get; set; }
    public string tempF { get; set; }
    public string Summary { get; set; }
    public string Icon { get; set; }
    public string PrecipIntensity { get; set; }
    public string PrecipProbability { get; set; }
    public string Temperature { get; set; }
    public string ApparentTemperature { get; set; }
    public string DewPoint { get; set; }
    public string Humidity { get; set; }
    public string Pressure { get; set; }
    public string windSpeed { get; set; }
    public string windGust { get; set; }
    public string windBearing { get; set; }
    public string cloudCover { get; set; }
    public string uvIndex { get; set; }
    public string visibility { get; set; }
    public string windspeedMiles { get; set; }
  }

Рассматриваемый JSON выглядит следующим образом:

{
    "data": {
        "request": [
            {
                "type": "LatLon",
                "query": "Lat 33.41 and Lon -86.94"
            }
        ],
        "nearest_area": [
            {
                "areaName": [
                    {
                        "value": "Bessemer Homestead"
                    }
                ],
                "country": [
                    {
                        "value": "United States of America"
                    }
                ],
                "region": [
                    {
                        "value": "Alabama"
                    }
                ],
                "latitude": "33.404",
                "longitude": "-86.939",
                "population": "0",
                "weatherUrl": [
                    {
                        "value": "http://api-cdn.worldweatheronline.com/v2/weather.aspx?q=33.4063059,-86.9385553"
                    }
                ]
            }
        ],
        "weather": [
            {
                "date": "2019-04-20",
                "astronomy": [
                    {
                        "sunrise": "06:12 AM",
                        "sunset": "07:22 PM",
                        "moonrise": "08:54 PM",
                        "moonset": "07:15 AM",
                        "moon_phase": "Waxing Gibbous",
                        "moon_illumination": "88"
                    }
                ],
                "maxtempC": "16",
                "maxtempF": "61",
                "mintempC": "7",
                "mintempF": "45",
                "totalSnow_cm": "0.0",
                "sunHour": "9.1",
                "uvIndex": "3",
                "hourly": [
                    {
                        "time": "0",
                        "tempC": "7",
                        "tempF": "44",
                        "windspeedMiles": "11",
                        "windspeedKmph": "17",
                        "winddirDegree": "278",
                        "winddir16Point": "W",
                        "weatherCode": "122",
                        "weatherIconUrl": [
                            {
                                "value": "http://cdn.worldweatheronline.net/images/wsymbols01_png_64/wsymbol_0004_black_low_cloud.png"
                            }
                        ],
                        "weatherDesc": [
                            {
                                "value": "Overcast"
                            }
                        ],
                        "precipMM": "0.1",
                        "humidity": "84",
                        "visibility": "5",
                        "pressure": "1009",
                        "cloudcover": "100",
                        "HeatIndexC": "7",
                        "HeatIndexF": "44",
                        "DewPointC": "4",
                        "DewPointF": "40",
                        "WindChillC": "4",
                        "WindChillF": "39",
                        "WindGustMiles": "15",
                        "WindGustKmph": "24",
                        "FeelsLikeC": "4",
                        "FeelsLikeF": "39",
                        "uvIndex": "0"

Я пытаюсь добраться до этой части JSON:

                    "weatherDesc": [
                        {
                            "value": "Overcast"
                        }

Когда я добавляю weatherDesc в HourData, я получаю следующее исключение:

Newtonsoft.Json.JsonReaderException: Ошибка чтения строки. непредвиденный токен: StartArray. Путь 'weatherDesc', строка 1, позиция 280. at Newtonsoft.Json.JsonReader.ReadAsStringInternal () в Newtonsoft.Json.JsonTextReader.ReadAsString () в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType (JsonReader читатель, контракт JsonContract, логический hasConverter) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateObject (Объект newObject, считыватель JsonReader, контракт JsonObjectContract, Член JsonProperty, идентификатор строки) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (JsonReader читатель, тип objectType, контракт JsonContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerMember, Объект существующего значения) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (JsonReader читатель, тип objectType, контракт JsonContract, член JsonProperty, JsonContainerContract containerContract, JsonProperty containerMember, Объект существующего значения) в Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (JsonReader читатель, тип objectType, логическое checkAdditionalContent) в Newtonsoft.Json.JsonSerializer.DeserializeInternal (читатель JsonReader, Тип objectType) в Newtonsoft.Json.JsonConvert.DeserializeObject (строковое значение, тип Type, Настройки JsonSerializerSettings) в Newtonsoft.Json.JsonConvert.DeserializeObject [T] (строковое значение, Настройки JsonSerializerSettings) в Newtonsoft.Json.JsonConvert.DeserializeObject [T] (строковое значение) в SuburbanWebService.ddays.apis.DarkskyApiReader.d__6.MoveNext () в D: \ Source \ techguy \ Suburban Test Проекты \ DarkSkyTest \ DarkSkyTest \ DarkskyApiReader.cs: строка 151 Одна или произошло больше ошибок.

Все разбирает нормально, кроме weatherDesc. Я понимаю, что он не вступает в эту часть JSON, по крайней мере, это мое понимание. Как я могу войти в WeatherDesc и получить данные в моем классе?

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

2 голосов
/ 03 мая 2019

Создать класс для хранения данных для weatherDesc:

public class WeatherDesc 
{
     public string Value { get; set; }
}

Тогда используйте его в вашем HourData классе:

public class HourData
{
    public IEnumerable<WeatherDesc> weatherDesc { get; set; }
    ...
}

По ошибке, это чтение массива, поэтому IEnumerable.

0 голосов
/ 03 мая 2019

Основная проблема заключается в том, что weatherDesc на самом деле является массивом, а не единственной строкой.Вы сможете исправить это, сделав поле weatherDesc string[] вместо string.Если вы хотите объединить массив singleton (набор, содержащий только 1 запись) в одну строку, вам придется десериализовать объект самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...