C# 使用System.Text.Json反序列化到不区分大小写的字典中
我正在尝试将json反序列化为具有Dictionary类型属性的对象。我将字典的压缩程序指定为StringComparer.OrdinalIgnoreCase。 这是一节课:C# 使用System.Text.Json反序列化到不区分大小写的字典中,c#,json-deserialization,.net-5,system.text.json,C#,Json Deserialization,.net 5,System.text.json,我正在尝试将json反序列化为具有Dictionary类型属性的对象。我将字典的压缩程序指定为StringComparer.OrdinalIgnoreCase。 这是一节课: class DictionaryTest { public Dictionary<string, string> Fields { get; set; } public DictionaryTest() { Fields = new Dictio
class DictionaryTest
{
public Dictionary<string, string> Fields { get; set; }
public DictionaryTest()
{
Fields = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
}
}
但是,当发生反序列化时,比较器将更改为通用比较器。因此,我无法以不区分大小写的方式访问字典的键
var points = new Dictionary<string, string>
{
{ "James", "9001" },
{ "Jo", "3474" },
{ "Jess", "11926" }
};
var testObj = new {Fields = points};
var dictionaryJsonText = JsonSerializer.Deserialize<DictionaryTest>(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,并保留大小写不敏感。目前没有一种方法可以执行您想要的操作。但是,您可以自己实现该功能 您可以为此特定案例创建自定义JsonConverter。例如: 公共密封类病例不敏感药物转换器 :JsonConverter { 公共覆盖字典读取 参考Utf8JsonReader读取器, 类型转换, JsonSerializerOptions选项 { var dic=字典JSONSerializer .反序列化REF读取器,类型转换,选项; 返回新词典 dic,StringComparer.OrdinalIgnoreCase; } 公共覆盖无效写入 Utf8JsonWriter, 字典值, JsonSerializerOptions选项 { JsonSerializer.Serialize writer、value、value.GetType、options; } } 然后,可以通过执行以下操作将其绑定到特定属性: 类字典测试 { [JsonConvertertypeofCaseInsensitiveDictionaryConverter] 公共字典字段{get;set;} =新字典; } 就这样。您可以按正常方式反序列化: var json=JsonSerializer.Serializenew DictionaryTest { 田地= { {1,2}, {三,四} } }; var dictionaryJsonText=JsonSerializer.Deserializejson; 上面的示例将生成一个带有不区分大小写键的字典