1

我想保存和加載文件從isolatedStorage基於this class由論壇成員Shawn Kendrot,我得到了整個this forum post反序列化JSON C#「第一次機會異常的類型 - newtonsoft」

我能夠保存沒有問題,但裝載然後deserialising 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

你能救你的數據文件出來'IsolatedStorageFile'然後用十六進制查看器來查看呢? – Aimeast

+0

通過十六進制查看器查看文件第一個字符是什麼 – Aimeast

+0

使用WinHex或XVI32查看文件。我只是懷疑文件的前導字節。 – Aimeast

回答

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);

+0

這是json字符串'string json = @「{'Name':'Bad Boys','ReleaseDate':'1995-4 -7T00:00:00','Genres':['Action','Comedy']}「;'方法調用是:'FileStorage.ReadSharedData >(FileName);'下一步是要使用檢索到的數據,但我沒有得到那麼遠 –

+0

你能否提供你試圖反序列化這個數據的結構? – ElGauchooo

+0

即時通訊不知道你的意思,我試圖檢索它作爲鍵/值對。 你會如何建議!?與我袒護我是C#中的noob :) –

相關問題