by Guest » 03 Jan 2025, 07:57
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}");

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.
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]class DictionaryTest
{
public Dictionary Fields { get; set; }
public DictionaryTest()
{
Fields = new Dictionary(StringComparer.OrdinalIgnoreCase);
}
}
[/code]
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]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}");
[/code]
[img]https://i.sstatic.net/2i9qm.png[/img]
[img]https://i.sstatic.net/g1SaC.png[/img]
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.