C# 使用JavaScriptSerializer.DeserializeObject如何获取使用不区分大小写的字符串比较器的字典?

C# 使用JavaScriptSerializer.DeserializeObject如何获取使用不区分大小写的字符串比较器的字典?,c#,json,javascriptserializer,C#,Json,Javascriptserializer,我有一些JSON需要反序列化,所以我使用JavaScriptSerializer.DeserializeObject,比如: var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>; var jsonObject=serializer.DeserializeObject(行)作为字典; 问题是返回的字典有一个区分大小写的密钥比较器,但我需要区分大小写。有没有办法找回不区分大

我有一些JSON需要反序列化,所以我使用JavaScriptSerializer.DeserializeObject,比如:

var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>;
var jsonObject=serializer.DeserializeObject(行)作为字典;
问题是返回的字典有一个区分大小写的密钥比较器,但我需要区分大小写。有没有办法找回不区分大小写的词典


编辑:我不希望将数据复制到新结构中,因为我有很多数据,这将非常昂贵

我建议创建一个继承自
Dictionary
的新类,并在该类的构造函数中指定不区分大小写的比较器。我不认为它可以在JSON之间序列化。

只需创建一个新的不区分大小写的字典,并用当前的字典填充它

var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>;
var caseInsensitiveDictionary = new Dictionary<string, object>(jsonObject, StringComparer.OrdinalIgnoreCase);
var jsonObject=serializer.DeserializeObject(行)作为字典;
var caseInsensitiveDictionary=新字典(jsonObject,StringComparer.OrdinalIgnoreCase);
[更新] 测试代码:

    Stopwatch stop1 = new Stopwatch();
    Stopwatch stop2 = new Stopwatch();

    //do test 100 000 times
    for (int j = 0; j < 100000; j++)
    {
        //generate fake data
        //object with 50 properties
        StringBuilder json = new StringBuilder();
        json.Append('{');
        for (int i = 0; i < 100; i++)
        {
            json.Append(String.Format("prop{0}:'val{0}',", i));
        }
        json.Length = json.Length - 1;
        json.Append('}');

        var line = json.ToString();

        stop1.Start();
        var serializer = new JavaScriptSerializer();
        var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>;
        stop1.Stop();

        stop2.Start();
        var caseInsensitiveDictionary = new Dictionary<string, object>(jsonObject, StringComparer.OrdinalIgnoreCase);
        stop2.Stop();
    }

    Console.WriteLine(stop1.Elapsed);
    Console.WriteLine(stop2.Elapsed);
    Console.Read();
Stopwatch stop1=新秒表();
秒表秒表2=新秒表();
//测试10万次
对于(int j=0;j<100000;j++)
{
//生成假数据
//具有50个属性的对象
StringBuilder json=新的StringBuilder();
json.Append('{');
对于(int i=0;i<100;i++)
{
Append(String.Format(“prop{0}:'val{0}',”,i));
}
json.Length=json.Length-1;
json.Append('}');
var line=json.ToString();
stop1.Start();
var serializer=新的JavaScriptSerializer();
var jsonObject=serializer.DeserializeObject(行)作为字典;
stop1.Stop();
stop2.Start();
var caseInsensitiveDictionary=新字典(jsonObject,StringComparer.OrdinalIgnoreCase);
stop2.Stop();
}
Console.WriteLine(停止1.已过);
Console.WriteLine(停止2.已过);
Console.Read();
结果是:

反序列化时间:1分钟21秒

字典创建时间:3秒


因此,主要的问题是反序列化。字典创建率约为4%

谢谢。我应该注意到,我真的希望避免这样做。我将拥有500GB的JSON数据(不是一个对象中的所有数据),为了节省时间,避免额外的数据移动是一个巨大的成功。作为最后的手段,我可能不得不这样做,但我愿意编写一些代码来节省时间。@Kang Su我怀疑您是否会在这段代码中遇到性能问题。数据量不是问题。时间随着对象数量的增加而增加。你的字典里有多少把钥匙?我建议您在编写额外代码之前测试此代码。对于任何给定对象,可能不超过50个键。但是有数以百万计的JSON对象,所以我将不得不这样做数百万次。也许我会尝试找出答案,但如果有办法得到一个不区分大小写的反序列化词典,那就太好了。谢谢Egor的时间安排。我想4%对我来说是可行的。至少这是值得开始的,我可以做一些不同的事情,如果分析显示这4%是接受度之间的差异。谢谢标记作为答案。在你回答这个问题4年后,我在谷歌上搜索了它,它仍然是最好的答案!