@Envywewok

Можно ли кастить long/double во float? Или long в double C#?

Получаю json по api преобразовываю в структуру, но там получается вложенные массивы и нужно это переконвертить в нужный мне класс. Но данные приходят иногда double иногда long. И не получается привести к общему типу пробывал и float и double. Сейчас оставил float так как в доке к API описано что должны быть float, но json парсер их определяет как double. Вот дока навсякий https://opensky-network.org/apidoc/rest.html.
Вот скрин структурки, там выделил одно и тоже поле. Оно бывает double бывает long.

5cc02c5c0105a607304018.png

Это класс, что бы он знал как конвертить json
public class AirData
    {
            public string icao24;
            public string callsign;
            public string origin_country;
            public long time_position;
            public long last_contact;
            public float longitude;
            public float latitude;
            public float baro_altitude;
            public bool on_ground;
            public float velocity;
            public float true_track;
            public float vertical_rate;
            public object sensors;
            public float geo_altitude;
            public string squawk;
            public bool spi;
            public long position_source;   
    }


Это метод где пытаюсь приводить типы как нужно
public List<AirData> ConvertToAirData()
        {
            var temp = new List<AirData>();
            foreach (var notformatted in states)
            {
                var airData = new AirData();
                airData.icao24 = (string) notformatted[0];
                airData.callsign = (string) notformatted[1];
                airData.origin_country = (string) notformatted[2];
                airData.time_position = (long) notformatted[3];
                airData.last_contact = (long) notformatted[4];
                airData.longitude = (float) notformatted[5];
                airData.latitude = (float) notformatted[6];
                airData.baro_altitude = (float) notformatted[7];
                airData.on_ground = (bool) notformatted[8];
                airData.velocity = (float) notformatted[9];
                airData.true_track = (float) notformatted[10];
                airData.vertical_rate = (float) notformatted[11];
                airData.sensors = notformatted[12];
                airData.geo_altitude = (float) notformatted[13];
                airData.squawk = (string) notformatted[14];
                airData.spi = (bool) notformatted[15];
                airData.position_source = (long) notformatted[16];
                temp.Add(airData);
            }
            return temp;
        }

Выдает постоянно ошибки о не правильном приведении типа.
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
@Envywewok Автор вопроса
Всем спасибо за ответы, пока проблема решилась заменой (double) на Convert.ToDouble(). Сейчас пойду дальше тестить. Может кто скажет в чем разница (double) и Convert.ToDouble(), а то проблема решилась а как не пойму. Еще предлагали Convert.ToSingle() - тоже интересно как он работает, из доки не понял.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
shai_hulud
@shai_hulud
Почему бы сразу не десериализовать в AirData? а не пытаться мапить руками.
При ручном мапинге можно использовать Convert.ToSingle(notformatted[7])
Ответ написан
@John_Nash
coder
API описано что должны быть float, но json парсер их определяет как double
Есть мнение, что он не знает про API, поэтому для числа с точкой предлагает double, без точки - long
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Данные, собственно, приходят в виде текста (json), который парсер трактует либо предполагая что и как, либо "оглядываясь" на структуру того куда это десериализуется…

Ну а var_value:1 - это в рамках догадок может быть что угодно - начиная от битового поля и через десятки вариаций signed|unsigned int до различных вариантов decimal, float и т.п.

Реальные типы - это уже из документации или хотя бы из представления предметной области.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы