При десериализации JSON я получаю `System.InvalidCastException` - PullRequest
0 голосов
/ 01 апреля 2020

Итак, в основном, у меня есть простое JSON сериализатор / десериализатор в C#, где я сохраняю StringCollections в .txt файлах с JSON внутри. Таким образом, в принципе, я могу успешно сохранить свой JSON в необработанном текстовом файле, например:

String path = Properties.Settings.Default.database + "//data.txt";
StringCollection data = Properties.Settings.Default.data;

File.WriteAllText(path, JsonSerializer.Serialize(data));

Но при десериализации файла для получения объекта с использованием этого кода:

string rawJson = File.ReadAllText(path);
StringCollection data = JsonSerializer.Deserialize<StringCollection>(rawJson);

Это дает мне следующее исключение:

System.InvalidCastException : 'Невозможно привести объект типа' System.Text. Json .JsonElement 'к типу' System.String '.'

Я искал этот StackOverflow и нашел пару сообщений об этом, но они действительно не решили мою проблему. Что я делаю не так?

ПРИМЕЧАНИЕ: Я использую System.Text.Json, а не Newtonsoft.Json.

1 Ответ

1 голос
/ 01 апреля 2020

Согласно документации Microsoft ниже приведены поддерживаемые типы https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to:

.NET primitives that map to JavaScript primitives, such as numeric types, strings, and Boolean.
User-defined Plain Old CLR Objects (POCOs).
One-dimensional and jagged arrays (ArrayName[][]).
Dictionary<string,TValue> where TValue is object, JsonElement, or a POCO.
Collections from the following namespaces.
System.Collections
System.Collections.Generic
System.Collections.Immutable

Так что StringCollection находится в System.Collections.Specialized пространстве имен. Так что это не поддерживается, у вас есть 2 варианта

  1. Реализация пользовательского конвертера: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-converters-how-to
  2. Измените тип возврата на например: List<string>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...