C# 反序列化json C“;类型为“newtonsoft”的首次机会例外;

C# 反序列化json C“;类型为“newtonsoft”的首次机会例外;,c#,json,windows-phone-8,background-process,windows-phone-8-emulator,C#,Json,Windows Phone 8,Background Process,Windows Phone 8 Emulator,我试图保存和加载文件从隔离存储的基础上由论坛成员,我得到了整个 我可以毫无问题地保存,但是当加载然后反序列化json文件时,我得到了一个错误 “A first chance exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.DLL” 我不知道我可能做错了什么,因为文件已保存,并且正在正确读取,但未进行反序列化。 json文件目前有4个条目,但稍后将有6个条目 有

我试图保存和加载文件从隔离存储的基础上由论坛成员,我得到了整个

我可以毫无问题地保存,但是当加载然后反序列化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;
    }
public static T ReadSharedData(字符串文件名),其中T:class,new()
{
T结果=新的T();
var mutex=GetMutex(文件名);
mutex.WaitOne();
fileName=GetSharedFileName(文件名);
尝试
{
var storage=IsolatedStorageFile.GetUserStoreForApplication();
if(storage.FileExists(fileName))
{
使用(var fileStream=storage.OpenFile(文件名,FileMode.Open,FileAccess.Read))
{
使用(var reader=newstreamreader(fileStream))
{
字符串json=reader.ReadToEnd();
if(string.IsNullOrEmpty(json)==false)
{
var data=JsonConvert.DeserializeObject(json);
如果(数据!=null)
{
结果=数据;
}
}
}
}
}
}
捕获{}
最后
{
mutex.Release();
}
返回结果;
}
此线路上出现问题:

var data = JsonConvert.DeserializeObject<T>(json);
var data=JsonConvert.DeserializeObject(json);
我的主页.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");
    }
  }
}
使用Microsoft.Phone.Shell;
使用JSON_Storage_Test.Resources;
使用系统诊断;
使用系统文本;
使用System.IO.IsolatedStorage;
名称空间JSON_存储_测试
{
公共部分类主页:PhoneApplicationPage
{
private const string FileName=“movieSettings.json”;
//建造师
公共主页()
{
初始化组件();
}
私有void SaveJ_单击(对象发送方,路由目标)
{
字符串json=@”{
“名字”:“坏男孩”,
“发布日期”:“1995-4-7T00:00:00”,
“类型”:[“动作”、“喜剧”]
}";
WriteSharedData(“movieSettings.json”,json);
}
//我不确定这里,返回类型应该是什么
//然后我将如何访问检索到的数据
私有void LoadJ_Click(对象发送方,路由目标)
{
FileStorage.ReadSharedData(文件名);
Debug.WriteLine(“单击加载”);
}
}
}

正如您自己指出的那样,您不知道如何处理返回值

FileStorage.ReadSharedData(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(文件名)

能否从
隔离存储文件中保存数据文件
然后通过十六进制查看器查看?通过十六进制查看器查看文件以查看第一个字符是什么使用WinHex或XVI32查看文件。我只是怀疑文件的前导字节。可能有答案。请在删除所有非ascii字符后重试char@Shawn肯德罗,也许你是看看我做错了什么,告诉我如何发送、接收和访问数据。我尝试了ElGauchooo的建议,但没有成功。过去几天我一直在绞尽脑汁,弄不明白这是json字符串
string json=@”{'Name':'Bad Boys','ReleaseDate':'1995-4-7T00:00:00','Genres':['Action','comic']};
方法调用是:
FileStorage.ReadSharedData(文件名)
下一步是使用检索到的数据,但我没有做到这一点。你能提供你试图将这些数据反序列化到的结构吗?我不知道你的意思,我正试图将其作为键/值对检索。你会怎么建议!?跟我说吧,我是C语言中的noob:)让我有点困惑的是那些
t
&
在函数签名中,它是什么意思?T表示您正在以通用方式使用此方法。您可以调用
ReadSharedData(..)
,您的代码将尝试将数据反序列化为
MyClassA
类。使用
ReadSharedData(..)调用它
它会将其反序列化为一个
MyOtherClass
对象。向我们展示您自己的调用。在那里您应该可以看到您使用的是哪种类型-我们需要这个类结构。