我正在尝试保存并加载来自this class的Shawn Kendrot基于this forum post的isolatedStorage中的文件,{{3}}。
我能够保存没有问题但是在加载然后反序列化json文件时我收到错误
“A first chance exception of type 'Newtonsoft.Json.JsonSerializationException'
occurred in Newtonsoft.Json.DLL”
我不知道我做错了什么,因为文件已保存并且正在正确读取但未反序列化。 json文件目前有4个条目,但稍后会有6个条目。
有谁能帮我理解这里有什么问题?
这个功能:
public static T ReadSharedData<T>(string fileName) where T : class, new()
{
T result = new T();
var mutex = GetMutex(fileName);
mutex.WaitOne();
fileName = GetSharedFileName(fileName);
try
{
var storage = IsolatedStorageFile.GetUserStoreForApplication();
if (storage.FileExists(fileName))
{
using (var fileStream = storage.OpenFile(fileName, FileMode.Open, FileAccess.Read))
{
using (var reader = new StreamReader(fileStream))
{
string json = reader.ReadToEnd();
if (string.IsNullOrEmpty(json) == false)
{
var data = JsonConvert.DeserializeObject<T>(json);
if (data != null)
{
result = data;
}
}
}
}
}
}
catch { }
finally
{
mutex.Release();
}
return result;
}
问题出现在这一行:
var data = JsonConvert.DeserializeObject<T>(json);
我的MainPage.xaml.cs
using Microsoft.Phone.Shell;
using JSON_Storage_Test.Resources;
using System.Diagnostics;
using System.Text;
using System.IO.IsolatedStorage;
namespace JSON_Storage_Test
{
public partial class MainPage : PhoneApplicationPage
{
private const string FileName = “movieSettings.json";
// Constructor
public MainPage()
{
InitializeComponent();
}
private void SaveJ_Click(object sender, RoutedEventArgs e)
{
string json = @"{
'Name': 'Bad Boys',
'ReleaseDate': '1995-4-7T00:00:00',
'Genres': [ 'Action', 'Comedy' ]
}";
FileStorage.WriteSharedData("movieSettings.json", json);
}
//Im not sure here, what should the return type be
//and how would i then access the retrieved data
private void LoadJ_Click(object sender, RoutedEventArgs e)
{
FileStorage.ReadSharedData<MainPage>(FileName);
Debug.WriteLine("Load clicked");
}
}
}
答案 0 :(得分:0)
你的问题是 - 正如你自己指出的那样 - 你不知道如何处理返回值。
FileStorage.ReadSharedData<MainPage>(FileName);
尝试将您的json字符串解析为MainPage类型的对象,该对象应具有属性Name
,ReleaseDate
和Genres
(应该是IEnumerable)。
您的MainPage
实际上没有此类属性,因此您的反序列化崩溃了。
尝试以下方法:
public class Move
{
public string Name;
public string ReleaseDate;
public IEnumerable<string> Genres
}
然后拨打var deserializedMove = FileStorage.ReadSharedData<Movie>(FileName);