C# 使用System.Text.Json反序列化到不区分大小写的字典中

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

我正在尝试将json反序列化为具有Dictionary类型属性的对象。我将字典的压缩程序指定为StringComparer.OrdinalIgnoreCase。 这是一节课:

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; 上面的示例将生成一个带有不区分大小写键的字典