Десериализация 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);

Другие вопросы по тегам