2010-11-10 14 views
0

Il semble que JSON.NET écrive JSON invalide, bien que je ne serais pas surpris si c'était dû à mon abus.JSON.NET écrit JSON invalide?

Il semble qu'il répète les derniers caractères de JSON:

/* ... */ "Teaser":"\nfoo.\n","Title":"bar","ImageSrc":null,"Nid":44462,"Vid":17}]}4462,"Vid":17}]} 

La chaîne de répétition est:

4462,"Vid":17}]} 

J'ai imprimé dehors à la console, donc je ne pense pas c'est un bogue dans le visualiseur de texte de Visual Studio.

Le code de sérialisation:

 static IDictionary<int, ObservableCollection<Story>> _sectionStories; 
     private static void writeToFile() 
     { 
      IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); 
      using (IsolatedStorageFileStream stream = storage.OpenFile(STORIES_FILE, FileMode.OpenOrCreate)) 
      { 
       using (StreamWriter writer = new StreamWriter(stream)) 
       { 
        writer.Write(JsonConvert.SerializeObject(_sectionStories)); 
       } 

      } 

#if DEBUG 
      StreamReader reader = new StreamReader(storage.OpenFile(STORIES_FILE, FileMode.Open)); 
      string contents = reader.ReadToEnd(); 

      JObject data = JObject.Parse(contents); 
      string result = ""; 
      foreach (char c in contents.Skip(contents.Length - 20)) 
      { 
       result += c; 
      } 
      Debug.WriteLine(result); 

      // crashes here with ArgumentException 
      // perhaps because JSON is invalid? 
      var foo = JsonConvert.DeserializeObject<Dictionary<int, List<Story>>>(contents); 
#endif 
     } 

que je fais quelque chose de mal ici? Ou est-ce un bug? Y a-t-il des solutions de contournement connues?

Curieusement, JObject.Parse() ne génère aucune erreur.

Je construis une application Silverlight pour Windows Phone 7.

+0

Il n'est pas clair quels sont ceux que vous voulez dire qui se répètent et quelle est la structure sous-jacente. – Aliostad

+0

Etes-vous sûr que cela ne fait pas partie de l'objet ??? Comment est-il possible d'avoir un élément répétitif et le texte est désérialisable? Je ne peux pas le croire. Mettez le JSON entier si vous le pouvez. – Aliostad

+0

X-Ref: http://stackoverflow.com/questions/4092985/datacontractserializer-problem-in-windows-phone-7 –

Répondre

2

Lors de l'écriture du fichier que vous spécifiez

FileMode.OpenOrCreate 

Si le fichier existe et est de 16 octets plus que les données vous avez l'intention d'écrire il (à partir d'une ancienne version de vos données qui se termine juste avec exactement les mêmes données) alors que les données seront toujours présentes lorsque vous avez fini d'écrire vos nouvelles données.

Solution:

FileMode.Create 

De: http://msdn.microsoft.com/en-us/library/system.io.filemode.aspx

FileMode.Create: Indique que le système d'exploitation devrait créer un nouveau fichier. Si le fichier existe déjà, il sera écrasé