Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JSON.Net Long Deserialization, не хочет десериализовать 
V
    Опции темы
uwannadie
Дата 15.6.2013, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



есть JSON данные, в которых содержатся строки в формате
Код

"arenaUniqueID ": 123456789000000L 

десериализация производится с помощью JSON.Net
имеется класс под этот JSON
Код

public class UnPickledData
{
    public Dictionary<int, Vehicle> vehicles { get; set; }        
    public long arenaUniqueID { get; set; }
    public Common common { get; set; }
    public Dictionary<int, Player> players { get; set; }
    public Personal personal { get; set; }
}

при попытке десериализации вылетает исключение:
Код

After parsing a value an unexpected character was encountered: L. Path 'arenaUniqueID', line 1, position 51810.

если заменить long на string получается то же самое.

вопрос: как это дело победить?

Это сообщение отредактировал(а) uwannadie - 15.6.2013, 19:50
--------------------
PM MAIL   Вверх
Fobos
Дата 15.6.2013, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Вопрос в лоб, а Вы пробовали how to example на сайте проекта? http://james.newtonking.com/projects/json-net.aspx я думаю это было бы хорошей отправной точкой.
PM MAIL ICQ   Вверх
uwannadie
Дата 15.6.2013, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



их поиск меня наверное уже ненавидит  smile 
--------------------
PM MAIL   Вверх
Fobos
Дата 15.6.2013, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



Нет, постойте, чудес не бывает. Если Вы вставляете Вашу строку "arenaUniqueID ": 123456789000000L в их пример она что, тоже падает?
PM MAIL ICQ   Вверх
uwannadie
Дата 15.6.2013, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



ну как минимум проблемная строка под их пример не подходит (т.к. там свой класс)
--------------------
PM MAIL   Вверх
Fobos
Дата 15.6.2013, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 9.2.2008
Где: Москва

Репутация: нет
Всего: нет



да не подходит, верно подмечено, но по аналогии переделать не получается? Я так понимаю Вы просто что-то напутали. Возьмите их пример и начните медленно переводить к Вашему проекту, на каждой итерации проверяйте работоспособность - проблема сразу найдется.
PM MAIL ICQ   Вверх
uwannadie
Дата 16.6.2013, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



да я знаю в чем проблема - парсер не понимает формат, которым описывается long (1234567890L) в с\c++ и пытается его привести к Int64 (сами данные формировались в JSON программой, написанной в связке c++\python)
но вот как побороть эту проблему без использования костылей а-ля найти все вхождения этого и удалить, я не в курсе  smile 

Это сообщение отредактировал(а) uwannadie - 16.6.2013, 00:36
--------------------
PM MAIL   Вверх
Экскалупатор
Дата 16.6.2013, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(uwannadie @  15.6.2013,  18:18 Найти цитируемый пост)
если заменить long на string получается то же самое.

меняется лонг на стринг только в классе или в json строке тоже?

беглое изучение справки на сайте тут говорит, что можно попробовать следующее:
1. использовать атрибуты, типа JsonProoertyAttribute или JsonConverterAttribute
2. использовать свой конвертер, т.е. написать наследника от CustomCreationConverter<>, и передавать его вместе с данными которые надо десериализовывать в десериализатор.

примерами они конечно не очень сильно разбрасываются, но если посидеть, то можно вкурить.
PM MAIL ICQ   Вверх
uwannadie
Дата 16.6.2013, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(Экскалупатор @ 16.6.2013,  11:20)
Цитата(uwannadie @  15.6.2013,  18:18 Найти цитируемый пост)
если заменить long на string получается то же самое.

меняется лонг на стринг только в классе или в json строке тоже?

беглое изучение справки на сайте тут говорит, что можно попробовать следующее:
1. использовать атрибуты, типа JsonProoertyAttribute или JsonConverterAttribute
2. использовать свой конвертер, т.е. написать наследника от CustomCreationConverter<>, и передавать его вместе с данными которые надо десериализовывать в десериализатор.

примерами они конечно не очень сильно разбрасываются, но если посидеть, то можно вкурить.

в классе, но толку от этого ноль, т.к. данные все равно в понимании парсера - число ибо без кавычек.
аттрибуты ставил, но результат аналогичный.
сейчас как раз курю над конвертерами
--------------------
PM MAIL   Вверх
uwannadie
Дата 16.6.2013, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



прикрутил свой конвертер - результат тот же.
причем сам конвертер оперирует нормально и отрабатывает без ошибок, но вот десериализация фейлится ;(
код конвертера (мб все же тут надуплил, хотя там все просто)
Код

using System;
using Newtonsoft.Json;

namespace ReplayManager.Core
{
    class CustomLongConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(long);
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return reader.Value.ToString();           
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotSupportedException();
        }
    }
}

и сам класс
Код

public class UnPickledData
{
    public Dictionary<int, Vehicle> vehicles { get; set; }
    [JsonConverter(typeof(CustomLongConverter))]
    public string arenaUniqueID { get; set; }
    public Common common { get; set; }
    public Dictionary<int, Player> players { get; set; }
    public Personal personal { get; set; }
}

сам JSON с вырезанными данными (ибо их там 130кб)
Код

{
    'vehicles':{
    ...
    },
    'arenaUniqueID':214197923159382012L,
    'common':{
    ...
    },
    'players':{
    ...
    },
    'personal':{
    ...
    }
}

--------------------
PM MAIL   Вверх
Экскалупатор
Дата 16.6.2013, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



Цитата(uwannadie @  16.6.2013,  16:23 Найти цитируемый пост)
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            return reader.Value.ToString();           
        }

тут бы наверное надо прочитать собственно значение, и попытаться его распарсить. типа long.Parse() или выяснить можно ли это сделать. поставь тут брекпоинт и посмотри что тут вообще происходит.
PM MAIL ICQ   Вверх
uwannadie
Дата 16.6.2013, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



там спокойно извлекается значение, причем вполне нормально.
исключение вызывается сразу после выхода из этой функции.
пробовал втыкать туда try...catch, но функция отрабатывает успешно

п.с. возможно проблема в том, что в JonToken.cs (http://json.codeplex.com/SourceControl/latest#128149) все целочисленные типы фактически рассматриваются как integer?

Это сообщение отредактировал(а) uwannadie - 16.6.2013, 19:42
--------------------
PM MAIL   Вверх
Экскалупатор
Дата 16.6.2013, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



может быть все что угодно )))

как сейчас выглядит метод? попробуй вернуть лонг(без приведения к object или ToString()).
PM MAIL ICQ   Вверх
uwannadie
Дата 16.6.2013, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 175
Регистрация: 5.6.2009
Где: Крым, Керчь

Репутация: нет
Всего: 1



Цитата(Экскалупатор @ 16.6.2013,  19:57)
может быть все что угодно )))

как сейчас выглядит метод? попробуй вернуть лонг(без приведения к object или ToString()).

без приведения к object не скомпилится ибо
Код

public abstract object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer);

в http://json.codeplex.com/SourceControl/latest#128133
если конвертер привести к 
Код

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
     return (long)reader.Value;           
}

ну и соответственно поменять в классе, то все равно вываливается ошибка при десериализации
--------------------
PM MAIL   Вверх
Экскалупатор
Дата 16.6.2013, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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

Добавлено через 54 секунды
думаю поможет реализация своего парсинга поможет разрулить эту ситуацию...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1143 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.