Десериализация не работает для всех узлов, использующих Newtonsoft Json - PullRequest
0 голосов
/ 26 апреля 2020

Я использую Newtonsoft. Json для десериализации строки JSON, найдено здесь . После десериализации я вижу только 53 из ожидаемых 480 узлов из строки JSON в моем объекте данных. Что я делаю не так?

using (System.IO.StreamReader sr = new System.IO.StreamReader(ReceiveStream, Encoding.UTF8))
{
    String content = sr.ReadToEnd();

    //var results = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(content);
    Newtonsoft.Json.Linq.JObject jObject = Newtonsoft.Json.Linq.JObject.Parse(content);
    var file = Newtonsoft.Json.Linq.JObject.Parse(content);
    var data = file["data"];
    foreach (var station in data)
    {
        foreach (var date in station)
        {
            string s_station = date.Path.ToString();
            s_station = s_station.Replace("data.", "");
            int s_station_int = Convert.ToInt32(s_station);

            foreach (var line in date)
            {
                var values = line.First;
                string component_id = values[0].ToString();
                string scope_id = values[1].ToString();
                string value = values[2].ToString();
                string date_end = values[3].ToString();
                string index_qual = values[4].ToString();

                double value_dbl = Convert.ToDouble(value);
                double index_qual_dbl = Convert.ToDouble(index_qual);
                int component_id_int = Convert.ToInt32(component_id);
                int scope_id_int = Convert.ToInt32(scope_id);

                UBA_values_List.Add(new UBADE_air_values_obj(date_end, component_id_int, scope_id_int, value_dbl, index_qual_dbl, s_station_int));
            }
        }
    }
}

1 Ответ

0 голосов
/ 27 апреля 2020

Проблема в том, что values[2] и values[4] равны нулю для некоторых станций в JSON. Первая такая станция - 260, которая является 54-й станцией в списке. Вы пытаетесь проанализировать эти значения как двойные, но двойное не может быть нулевым, поэтому оно вызывает исключение. Мои силы психи c говорят мне, что приведенный выше код находится внутри try / catch и блок catch, вероятно, пуст. Таким образом, список заполнен только первыми 53 станциями до того, как сработает исключение.

Вам нужно исправить свой код, чтобы он мог обрабатывать возможные нулевые значения. Вместо использования Convert.ToDouble() используйте double.TryParse(), который сообщит вам, успешно ли выполнено преобразование. Если это не удалось, вы можете либо сбросить неверные данные, либо установить вместо них значение по умолчанию.

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