Модератор: Модераторы разделов
devilr
Сообщения: 3697
ОС: Mandriva => Gentoo (~amd64)
Сообщение
devilr » 06.01.2017 16:41
Есть простой код (разбор строки:
Код: Выделить всё
string jStr = "[{\"name\":\"0\",\"weight\":[1,2,3],\"count\":9}]";
JavaScriptSerializer json = new JavaScriptSerializer();
List<Object> objects = json.Deserialize<List<Object>>(jStr);
System.Console.WriteLine("objects.count = " + objects.Count);
foreach (var o in objects)
{
Dictionary<string, object> temp = (Dictionary<string, Object>)o;
string name = (string)temp["name"];
int count = (int)temp["count"];
//Object[] weightData = (Object[])temp["weight"]; //работает в win, не работает в lin
System.Console.WriteLine("name = " + name);
System.Console.WriteLine("count = " + count);
}
Если раскомметировать строку, то программа падает с System.InvalidCastException, причем только в linux. В win все работает.
Почему такое может быть?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
delvin-fil
Сообщения: 135
ОС: Linux → Gentoo
Сообщение
delvin-fil » 06.01.2017 18:28
А в линухе разве уже есть MSDN? С какого перепуга обращение с преобразованием будет работать?
import __hello__
devilr
Сообщения: 3697
ОС: Mandriva => Gentoo (~amd64)
Сообщение
devilr » 06.01.2017 18:36
delvin-fil писал(а): ↑ 06.01.2017 18:28
А в линухе разве уже есть MSDN? С какого перепуга обращение с преобразованием будет работать?
В "линухе" есть mono (monodevelop). В котором этот код работает. Но, с проблемами. Я, как раз, постарался привести минимальный кусок кода, для демонстрации проблемы.
P.S. Да, мне c# не нравится. Но - есть работа, которую надо сделать. Поэтому, прошу помощи у сообщества - вдруг кто уже наступал на эти грабли.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Bizdelnick
Модератор
Сообщения: 21377
Статус: nulla salus bello
ОС: Debian GNU/Linux
Сообщение
Bizdelnick » 07.01.2017 16:15
Пишите правильно:
в консоли
вк у́пе (с чем-либо)
в о бщем
воо бще в течение (часа)
новичо к
ню анс
по у молчанию приемле мо
проблем а
пробо вать
траф ик
devilr
Сообщения: 3697
ОС: Mandriva => Gentoo (~amd64)
Сообщение
devilr » 07.01.2017 20:29
Задача так и не решена. Неужели никто с таким не сталкивался?
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
anonymous.ru
Сообщения: 614
Сообщение
anonymous.ru » 07.01.2017 21:32
devilr писал(а): ↑ 07.01.2017 20:29
Задача так и не решена. Неужели никто с таким не сталкивался?
В temp["weight"] не массив, а ArrayList
Вот так работает
Код: Выделить всё
ArrayList ARweightData = (ArrayList)temp["weight"];
Object[] weightData = ARweightData.ToArray ();
anonymous.ru
Сообщения: 614
Сообщение
anonymous.ru » 07.01.2017 21:41
Даже вот так
Код: Выделить всё
Object[] weightData = ((ArrayList)temp["weight"]).ToArray ();
devilr
Сообщения: 3697
ОС: Mandriva => Gentoo (~amd64)
Сообщение
devilr » 07.01.2017 21:43
Осталось непонятным, почему в win то работает. Видимо, надо будет делать 2 варианта и разделять их как-то.
Но в целом, можно и так.
Спасибо за помощь!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Vascom
Сообщения: 1699
ОС: Fedora 32
Сообщение
Vascom » 10.01.2017 10:05
devilr писал(а): ↑ 07.01.2017 21:43
...Видимо, надо будет делать 2 варианта и разделять их как-то.
А не лучше ли оставить один вариант, который работает везде?
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64
Сообщение
NickLion » 10.01.2017 12:22
Кстати, в MSDN советуют использовать Json.NET для (де)сериализации. JavaScriptSerializer не гарантирует тип для JSON массива.
Если всё же хотите использовать этот тип, то не проще ли сделать что-то вроде:
Код: Выделить всё
IEnumerable weightData = (IEnumerable)temp["weight"];
int i = 0;
foreach (Object weight in weightData) {
System.Console.WriteLine($"weight[{i}] = {weight}");
i++;
}
В Linux работает, по идее, в Windows тоже работать должно.
devilr
Сообщения: 3697
ОС: Mandriva => Gentoo (~amd64)
Сообщение
devilr » 11.01.2017 13:28
Да, в windows работает. Только что проверил. Правда, с использованием IEnumerable требуется переписывать гораздо больше, чем в случае, предложенном выше (с ArrayList).
А насчет "хотите - не хотите" - мне нужно было просто проверить работу программы, чтобы в результате переписать ее на обычном c++. Проверил. Переписал.
Всем спасибо за помощь!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума