Каков наилучший способ десериализации объекта из json в класс? - PullRequest
0 голосов
/ 16 мая 2019

Я внедряю систему для отслеживания GPS, используя API веб-службы.

ОШИБКА:

Необработанное исключение типа 'Newtonsoft.Json.JsonSerializationException'произошла в Newtonsoft.Json.dll

Дополнительная информация: Невозможно десериализовать текущий массив JSON (например, [1,2,3]) в тип 'TrackingRequest.Devices', поскольку для типа требуется объект JSON (например, {"name ":" value "}) для правильной десериализации.

Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {" name ":" value "}), либо измените десериализованный тип на массивили тип, который реализует интерфейс коллекции (например, ICollection, IList), такой как List, который можно десериализовать из массива JSON.JsonArrayAttribute также можно добавить к типу, чтобы принудительно десериализовать его из массива JSON.

Это приложение для веб-форм в c # с HttpClient с использованием json из Newtonsoft.

Мой код

using (HttpClient clientKey = new HttpClient())
                   {
                        clientKey.BaseAddress = new Uri("http://api.trackingdiary.com/");
                        clientKey.DefaultRequestHeaders.Add("Hive-Session", key);
                        clientKey.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                        HttpResponseMessage responseKey = clientKey.GetAsync("/v2/geo/devices/list").Result;
                        using (HttpContent contentkey = responseKey.Content)
                       {
                            Task<string> resultKey = contentkey.ReadAsStringAsync();
                            Devices obj = JsonConvert.DeserializeObject<Devices>(resultKey.Result);

                           Console.WriteLine();
                       }
                   }

Мой класс:

    class position
    {
        [JsonProperty("lat")]
        public int lat { get; set; }
        [JsonProperty("lng")]
        public int lng { get; set; }
        [JsonProperty("hdop")]
        public int hdop { get; set; }
        [JsonProperty("fix")]
        public bool fix { get; set; }
    }

    class Devices
    {
        [JsonProperty("id")]
        public int id { get; set; }
        [JsonProperty("name")]
        public string name { get; set; }
        [JsonProperty("date_contacted")]
        public string date_contacted { get; set; }
        [JsonProperty("startup")]
        public string startup { get; set; }
        [JsonProperty("position")]
        public position position { get; set; }    
    }
}

Я хочу, чтобы объекты выполнялись в DataTable.

JSON EXAMPLE JSONПример

1 Ответ

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

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

Попробуйте это:

IEnumerable<Devices> devices = JsonConvert.DeserializeObject<IEnumerable<Devices>>(resultKey.Result);

И, пожалуйста, переименуйте класс в единственное, так как он, по-видимому, представляет отдельный Device.

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