Json-десериализация List <T>завершается неудачно: тип требует JSON-массив для корректной десериализации - PullRequest
0 голосов
/ 30 июня 2019

Я работаю над приложением Xamarin.Forms, в котором мне нужно кэшировать данные, когда нет подключения к Интернету. В настоящее время я использую встроенный механизм персистентности Application.Current.Properties для сохранения данных, который работает просто отлично. Однако для более сложного объекта я не могу десериализовать.

У меня есть следующий объект Модель:

public class SPL
{
    public SPL(Point point, Location location)
    {
        Point = point;
        Location = location;
    }

    public Location Location { get; set; }
    public Point Point { get; set; }
}

Где Location имеет два свойства типа double и Point имеет два свойства типа DateTime и типа double соответственно.

Во время выполнения приложения я постоянно сохраняю данные в локальном кеше, например, всякий раз, когда нет подключения к Интернету

SPL spl = new SPL(point, location);
SPLValues.Add(spl);
var serializedSpl = JsonConvert.SerializeObject(SPLValues);
Application.Current.Properties["splvalues"] = serializedSpl;

Прерывание последней строки и проверка с помощью отладчика показывает, что данные сохранены .

Когда приложение засыпает, я звоню Current.SavePropertiesAsync();. После возобновления работы приложения я пытаюсь десериализовать локальный кеш, например

public List<T> GetCache<T>(string key) where T : class
{
    IDictionary<string, object> properties = Application.Current.Properties;
    if (properties.ContainsKey(key))
    {
        var data = JsonConvert.DeserializeObject<List<T>>(key); // Fails here
        return data;
    }
    return new List<T>();
}

Что не получается. Исключение составляет

Необработанное исключение: Newtonsoft.Json.JsonReaderException: неожиданный символ, обнаруженный при разборе значения: s. Путь '', строка 0, позиция 0. произошло

UPDATE

Как указал JOSEFtw, в моем вызове десериализации отсутствовал параметр, поэтому теперь он выглядит следующим образом: var data = JsonConvert.DeserializeObject<List<T>>(properties[key]);

После исправления я теперь сталкиваюсь с этой ошибкой:

Необработанное исключение: Newtonsoft.Json.JsonSerializationException: Невозможно десериализовать текущий объект JSON (например, {"name": "value"}) в тип 'System.Collections.Generic.List`1 [CacheDemo.Models.SPL]' потому что для корректной десериализации тип требует массив JSON (например, [1,2,3]). Чтобы исправить эту ошибку, либо измените JSON на массив JSON (например, [1,2,3]), либо измените десериализованный тип так, чтобы это был нормальный тип .NET (например, не примитивный тип, например, целое число, а не тип коллекции, например, массив или список), которые можно десериализовать из объекта JSON. JsonObjectAttribute также можно добавить к типу, чтобы заставить его десериализоваться из объекта JSON. Путь «Местоположение», строка 1, позиция 12. произошло

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Я думаю, что вы должны десериализовать

properties[key] 

вместо

key

Как это

var data = JsonConvert.DeserializeObject<List<T>>(properties[key]); 
0 голосов
/ 30 июня 2019

Я на самом деле решил проблему, но это не то, что я ожидал. Я не хочу публиковать это как ответ, так как это не связано с реальной ошибкой. Однако, казалось, что Properties содержал пустой объект Location (у него не было свойств) и, следовательно, после десериализации он потерпел неудачу. Что само по себе странно для меня, так как я ожидал бы, что он просто возвратит пустой объект? Я не могу понять, как объект Location был записан на диск как пустой, а запуск .Clear() на Properties, похоже, не удалял его. То, что работало, состояло в том, чтобы развернуть приложение на физическом устройстве, и внезапно ошибка исчезла. Проверка кэша Properties с использованием отладчика на физическом устройстве показала, что пустой объект Location был удален, и поэтому я предполагаю, что пустой объект Location был ошибочным.

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