Page 1 of 1

Deserialisieren Sie mithilfe von System.Text.Json in ein Wörterbuch, bei dem die Groß-/Kleinschreibung nicht berücksicht

Posted: 03 Jan 2025, 07:57
by Guest
Ich versuche, JSON in ein Objekt mit einer Eigenschaft vom Typ Dictionary zu deserialisieren. Ich gebe den Vergleicher für das Wörterbuch als StringComparer.OrdinalIgnoreCase an.
Hier ist diese Klasse:

Code: Select all

class  DictionaryTest
{
public Dictionary Fields { get; set; }
public DictionaryTest()
{
Fields = new Dictionary(StringComparer.OrdinalIgnoreCase);
}
}
Aber wenn die Deserialisierung erfolgt, wird der Vergleich zum generischen geändert. Daher kann ich nicht ohne Berücksichtigung der Groß-/Kleinschreibung auf die Schlüssel meines Wörterbuchs zugreifen.

Code: Select all

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}");
Image

Image
Wie kann ich also JSON deserialisieren? eine Klasse wie die folgende und pflegen Sie diese Groß- und Kleinschreibung? Irgendwelche Vorschläge? Ich verwende .net5.
Und ich sollte erwähnen, dass dieser Code mit Newtonsoft perfekt funktionieren würde. Der Vergleicher bleibt OrdinalIgnoreCase und die Groß-/Kleinschreibung wird beibehalten.