Десериализовать в регистронезависимый словарь с помощью System.Text.Json.C#

Место общения программистов C#
Ответить
Anonymous
 Десериализовать в регистронезависимый словарь с помощью System.Text.Json.

Сообщение Anonymous »

Я пытаюсь десериализовать json в объект со свойством типа Dictionary. Я указываю компраратор для словаря как StringComparer.OrdinalIgnoreCase.
Вот этот класс:

Код: Выделить всё

class  DictionaryTest
{
public Dictionary Fields { get; set; }
public DictionaryTest()
{
Fields = new Dictionary(StringComparer.OrdinalIgnoreCase);
}
}
Но когда происходит десериализация, компаратор меняется на общий. Следовательно, я не могу получить доступ к ключам моего словаря без учета регистра.

Код: Выделить всё

var points = new Dictionary
{
{ "James", "9001" },
{ "Jo", "3474" },
{ "Jess", "11926" }
};

var testObj = new DictionaryTest{Fields = points};
var dictionaryJsonText =  JsonSerializer.Deserialize(JsonSerializer.Serialize(testObj, options:new JsonSerializerOptions()
{
IgnoreNullValues = true,
WriteIndented = false,
PropertyNamingPolicy = null,
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
DictionaryKeyPolicy = JsonNamingPolicy.CamelCase,
PropertyNameCaseInsensitive = true
}));

string nameJsonText = "", nameJsonText2="";
//Because of the naming policy specified above, the keys are camelCase.
//So keys are james, jo and jess
//I expect to be able to access either james, or James as keys.
dictionaryJsonText?.Fields.TryGetValue("James", out nameJsonText);
dictionaryJsonText?.Fields.TryGetValue("james", out nameJsonText2);
Console.WriteLine($"Name with system.text.json is:  {nameJsonText}");
Console.WriteLine($"Name with system.text.json is:  {nameJsonText2}");
Console.WriteLine($"Comparer is {dictionaryJsonText?.Fields.Comparer}");
Изображение

Изображение
Итак, как мне выполнить десериализацию json в класс, подобный приведенному ниже, и поддерживать его нечувствительность к регистру? Есть предложения? Я использую .net5.
И должен отметить, что этот код отлично работает с Newtonsoft. Компаратор останется в формате OrdinalIgnoreCase, и нечувствительность к регистру будет сохранена.

Подробнее здесь: https://stackoverflow.com/questions/673 ... -text-json
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»