Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
Aimzot
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 7
1

Не получается десериализовать JSON запрос

15.08.2019, 08:55. Просмотров 1588. Ответов 7
Метки нет (Все метки)

Доброе время суток!
У меня есть такой Json запрос
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
items   
0   
nm  "185 НТ Чистый двор-ISUZU FORWARD"
cls 2
id  825
mu  0
pos {}
lmsg    {}
uacl    513
1   
nm  "394 ХР Чистый двор-NISSAN ATLAS"
cls 2
id  332
mu  0
pos {}
lmsg    {}
uacl    513
Я использую класс
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class Odjectmass
    {
        public List<Items> Itm { get; set; }
    }
    public class Items
    {
 
        public string nm { get; set; }
 
        public int cls { get; set; }
 
        public int id { get; set; }
 
        public int mu { get; set; }
    }
И пытаюсь забрать так
C#
1
2
3
4
5
6
7
8
 List<Items> itm = (List<Items>)JsonConvert.DeserializeObject(str, typeof(List<Items>));
                foreach (var Items in itm)
                {
                    textBox3.Text = Items.nm;
                    textBox3.Text = Convert.ToString(Items.cls);
                    textBox3.Text = Convert.ToString(Items.id);
                    textBox3.Text = Convert.ToString(Items.mu);
                }
Мне выводит ошибку
Newtonsoft.Json.JsonSerializationException: "Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1[test.Items]' because the type requires a JSON array (e.g. [1,2,3]) to deserialize correctly.
To fix this error either change the JSON to a JSON array (e.g. [1,2,3]) or change the deserialized type so that it is a normal .NET type (e.g. not a primitive type like integer, not a collection type like an array or List<T>) that can be deserialized from a JSON object. JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object.
Path 'searchSpec', line 1, position 14."

В чем может быть проблема или, что я не так делаю?
Подскажите пожалуйста
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.08.2019, 08:55
Ответы с готовыми решениями:

Десериализовать JSON
Помогите десериализовать JSON. Нужны id и name из quests var json = { &quot;obj&quot;:{&quot;order&quot;:, ...

Десериализовать JSON
Здравствуйте, помогите десериализовать:...

Десериализовать JSON
Здравствуйте, подскажите, как десериализовать данный JSON. string users =...

Десериализовать JSON VK API
Вот недавно решил сделать приложение для контакта, однако столкнулся с трудностью(не я один, судя...

Как правильно десериализовать ответ в Json
Как правильно десериализовать ответ в Json (С вложенными классами) используя библиотеку...

7
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
15.08.2019, 09:49 2
Aimzot, если твой JSON такого вида, как ты прислал - то это не верный формат, поэтому его десериализовать и не получается. вид должен быть таким:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
  "items" : [
    {
      "nm" : "185 НТ Чистый двор-ISUZU FORWARD",
      "cls" : 2,
      "id" : 825,
      "mu" : 0,
      "pos" : {},
      "lmsg" : {},
      "uacl" : 513
    },
    {
      "nm" : "394 ХР Чистый двор-NISSAN ATLAS",
      "cls" : 2,
      "id" : 332,
      "mu" : 0,
      "pos" : {},
      "lmsg" : {},
      "uacl" : 513
    }      
  ]
}
Добавлено через 31 минуту
а данные получаем так:
C#
1
2
3
4
5
6
7
8
9
10
11
            using (StreamReader sr = new StreamReader(@"file.json", Encoding.Default))
            {
                string jsonFileText = sr.ReadToEnd();
 
                var jsonObj = (Odjectmass)JsonConvert.DeserializeObject(jsonFileText, typeof(Odjectmass));
 
                foreach (var Row in jsonObj.items)
                {
                    Console.WriteLine($"{Row.nm}, {Row.cls}, {Row.id}, {Row.mu}");
                }  
            }
0
Aimzot
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 7
15.08.2019, 10:09  [ТС] 3
Приходит от сервера он в другом виде, а это я с мозилы скопировал

Добавлено через 10 минут
Приходит от сервера он в другом виде, а это я с мозилы скопировал
Попробовал так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
string sid = textBox1.Text;
string url = "http://glonass03.online/wialon/ajax.html?svc=core/search_items&params={%22spec%22%3A{%22itemsType%22%3A%22%22%2C%22propName%22%3A%22sys_name%22%2C%22propValueMask%22%3A%22*%22%2C%22sortType%22%3A%22sys_name%22}%2C%22flags%22%3A1025%2C%22force%22%3A1%2C%22from%22%3A0%2C%22to%22%3A0}&sid=" + sid + ""; 
            using (var webClient = new WebClient())
            {
                var pars = new NameValueCollection();
var response = webClient.UploadValues(url, pars);
string str = Encoding.UTF8.GetString(response);            
textBox2.Text = str;
 
                var jsonObj = (Odjectmass)JsonConvert.DeserializeObject(str, typeof(Odjectmass));
                foreach (var Row in jsonObj.Itm)
                {
                    textBox3.Text = Row.nm;
                    textBox3.Text = Convert.ToString(Row.cls);
                    textBox3.Text = Convert.ToString(Row.id);
                    textBox3.Text = Convert.ToString(Row.mu);
                }
Используя классы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class Odjectmass
    {
        public List<Items> Itm { get; set; }
    }
    public class Items
    {
 
        public string nm { get; set; }
 
        public int cls { get; set; }
 
        public int id { get; set; }
 
        public int mu { get; set; }
    }
Выдает ошибку
System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."

test.Odjectmass.Itm.get вернул null.
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
15.08.2019, 10:18 4
Aimzot, какой сид?
0
15.08.2019, 10:18
Aimzot
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 7
15.08.2019, 10:20  [ТС] 5
Это ключ сессии действует 30 мин 1c126dd56d19a3f33e7db9415bc0d3e3
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
15.08.2019, 10:38 6
Лучший ответ Сообщение было отмечено Aimzot как решение

Решение

Aimzot,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
           string Url = "http://glonass03.online/wialon/ajax.html?svc=core/search_items&params={%22spec%22%3A{%22itemsType%22%3A%22%22%2C%22propName%22%3A%22sys_name%22%2C%22propValueMask%22%3A%22*%22%2C%22sortType%22%3A%22sys_name%22}%2C%22flags%22%3A1025%2C%22force%22%3A1%2C%22from%22%3A0%2C%22to%22%3A0}&sid=1c126dd56d19a3f33e7db9415bc0d3e3";
 
            using (WebClient webClient = new WebClient())
            {
                string Response = Encoding.UTF8.GetString(webClient.UploadValues(Url, new NameValueCollection()));
                
                var jsonObj = (Odjectmass)JsonConvert.DeserializeObject(Response, typeof(Odjectmass));
 
                foreach (var Row in jsonObj.items)
                {
                    Console.WriteLine($"{Row.nm}, {Row.cls}, {Row.id}, {Row.mu}");
                }
            }
Добавлено через 24 секунды
в Url записал полный путь вместе с сидом.

Добавлено через 1 минуту
еще нужно так
C#
1
public List<Items> items { get; set; }
1
Aimzot
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 7
15.08.2019, 11:06  [ТС] 7
Получил 0, как я понял это первый элемент массива Items, а как тогда забрать данные с этого элемент, тут получается массив в массиве

Добавлено через 17 минут
Извиняюсь, тупанул немного, все работает
Спасибо за помощь
0
AndreyVorobey
613 / 407 / 217
Регистрация: 14.04.2015
Сообщений: 1,683
15.08.2019, 11:14 8
Лучший ответ Сообщение было отмечено Aimzot как решение

Решение

Aimzot, сделай так:
1) в класс Items добавь:
C#
1
2
3
4
public override string ToString()
        {
            return $"{nm}, {cls}, {id}, {mu}";
        }
2) вынеси получение данных в отдельный метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        public static List<Items> ReturnData(string url)
        {
            List<Items> ListItems = new List<Items>();
 
            using (WebClient webClient = new WebClient())
            {
                string Response = Encoding.UTF8.GetString(webClient.UploadValues(url, new NameValueCollection()));
 
                var jsonObj = (Odjectmass)JsonConvert.DeserializeObject(Response, typeof(Odjectmass));
      
                foreach (var Row in jsonObj.items)
                {
                    Items Item = new Items
                    {
                        nm = Row.nm,
                        cls = Row.cls,
                        id = Row.id,
                        mu = Row.mu
                    };
                    ListItems.Add(Item);
                }
            }
            return ListItems;
        }
3) в кнопку добавь:
C#
1
2
3
4
            foreach (var Row in ReturnData())
            {
                textBox3.Text += Row.ToString();
            }
1
15.08.2019, 11:14
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2019, 11:14

Не могу десериализовать json-строку(как правильнее десериализировать, чтобы считать данные)?
json-строка: &quot;Information1&quot;: } десериализовал через json2csharp: public class ABC ...

Не получается прочитать json
доброго времени суток. столкнулся с такой проблемой, не могу спарсить значения с json. как не...

Не получается сохранить JSON в объект
После запроса к API Вконтакте получаю ответ в формате JSON следующего вида: { &quot;response&quot;: }...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru