List <T>的Json反序列化失败:该类型需要JSON数组才能正确反序列化

时间:2019-06-30 10:25:19

标签: c# json-deserialization

我正在Xamarin.Forms应用程序上工作,当没有Internet连接可用时,我需要在其中缓存数据。我目前正在使用内置的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。发生

更新

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 个答案:

答案 0 :(得分:1)

我认为您应该反序列化

properties[key] 

代替

key

var data = JsonConvert.DeserializeObject<List<T>>(properties[key]); 

答案 1 :(得分:0)

我实际上已经解决了问题,但这不是我所期望的。我不愿意将其发布为答案,因为它并没有真正与实际错误联系在一起。但是,似乎Properties包含一个空的Location对象(它没有属性),因此在反序列化后它失败了。哪一个对我来说很奇怪,就像我期望的那样,它只是返回一个空对象?我无法收集如何将Location对象作为空对象写入磁盘,并且在.Clear()上运行Properties似乎没有将其删除。有效的方法是将应用程序部署到物理设备上,错误突然消失了。使用物理设备上的调试器检查Properties缓存后发现,空的Location对象已被删除,这就是为什么我假设空的Location对象有问题。 / p>