使用JavaScriptSerializer.我怎样才能得到一个使用大小写不敏感的字符串比较器的字典

本文关键字:大小写 一个 字典 比较器 字符串 JavaScriptSerializer 使用 | 更新日期: 2023-09-27 18:16:29

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

var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>;

问题是返回的Dictionary有一个区分大小写的键比较器,但我需要区分大小写。是否有某种方法可以返回不区分大小写的Dictionary ?

编辑:我宁愿不把数据复制到一个新的结构,因为我有很多数据,这将是昂贵的。

使用JavaScriptSerializer.我怎样才能得到一个使用大小写不敏感的字符串比较器的字典

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

var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>;
var caseInsensitiveDictionary = new Dictionary<string, object>(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();

结果是:

反序列化时间:1分21秒

字典创建时间:3秒

所以,主要的问题是反序列化。字典创建约4%

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