Десериализация json C# "Первое случайное исключение типа - newtonsoft"
Я пытаюсь сохранить и загрузить файлы из Shawn Kendrot, основанные на этом классе, от участника форума Shawn Kendrot, который я получил в этом сообщении на форуме.
Я могу сохранить без проблем, но при загрузке и десериализации файла 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");
}
}
}
1 ответ
Ваша проблема - как вы сами указали - вы не знаете, что делать с возвращаемым значением.
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);