JSON.NET пишет неверный JSON? - PullRequest
0 голосов
/ 10 ноября 2010

Похоже, что JSON.NET пишет неверный JSON, хотя я не удивлюсь, если бы это произошло из-за моего неправильного использования.

Похоже, что он повторяет последние несколько символов JSON:

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

Повторяющаяся строка:

4462,"Vid":17}]}

Я распечатал ее на консоли, поэтому я не думаю, что это ошибка в визуализаторе текста Visual Studio.

Код сериализации:

       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
        }

Я что-то здесь не так делаю?Или это ошибка?Есть какие-нибудь известные обходные пути?

Любопытно, что JObject.Parse() не выдает никаких ошибок.

Я создаю приложение Silverlight для Windows Phone 7.

1 Ответ

2 голосов
/ 10 ноября 2010

При записи файла вы указываете

FileMode.OpenOrCreate

Если файл существует и на 16 байт длиннее данных, которые вы намереваетесь записать в него (из более старой версии ваших данных, которая просто заканчиваетсяточно такие же данные), тогда эти данные будут по-прежнему присутствовать, когда вы закончите запись новых данных.

Решение:

FileMode.Create 

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

FileMode.Create: указывает, что операционная система должна создать новый файл.Если файл уже существует, он будет перезаписан

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...