反序列化json C#“类型的第一次机会异常 - newtonsoft”

时间:2014-02-06 07:25:52

标签: c# json windows-phone-8 background-process windows-phone-8-emulator

我正在尝试保存并加载来自this classShawn 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");
    }
  }
}

1 个答案:

答案 0 :(得分:0)

你的问题是 - 正如你自己指出的那样 - 你不知道如何处理返回值。

FileStorage.ReadSharedData<MainPage>(FileName);尝试将您的json字符串解析为MainPage类型的对象,该对象应具有属性NameReleaseDateGenres(应该是IEnumerable)。

您的MainPage实际上没有此类属性,因此您的反序列化崩溃了。

尝试以下方法:

public class Move
{
    public string Name;
    public string ReleaseDate;
    public IEnumerable<string> Genres
}

然后拨打var deserializedMove = FileStorage.ReadSharedData<Movie>(FileName);