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

标签 c# json javascriptserializer

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

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

问题是返回的字典有一个区分大小写的键比较器,但我需要不区分大小写。有什么方法可以取回不区分大小写的字典吗?

编辑:我不想将数据复制到新结构,因为我有很多数据,而且这样做的成本很高。

最佳答案

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

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%

关于c# - 使用 JavaScriptSerializer.DeserializeObject 如何取回使用不区分大小写的字符串比较器的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8350169/

相关文章:

c# - 如何让 JavaScriptSerializer 忽略 [ScriptIgnore] 标签?

c# - Lambda 表达式的位置在延迟初始化中是否重要?

python - 编码 : TypeError: write() argument must be str, 不是字节

c# - 如何将此格式的 JSON 返回到字符串数组中

python - Python 中联合多个嵌套 JSON

json - 如何使用 jq 将项目映射到 json 结构中?

serialization - JavaScriptSerializer 和 monodevelop

c# - 使用 ImageMagick 和 C# 比较两个图像

c# - 将谷歌时区转换为 .net 时区

c# - 在 XSLT 中使用从 C# 代码传递的参数