C# 使用JavaScriptSerializer.DeserializeObject如何获取使用不区分大小写的字符串比较器的字典?
我有一些JSON需要反序列化,所以我使用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(行)作为字典; 问题是返回的字典有一个区分大小写的密钥比较器,但我需要区分大小写。有没有办法找回不区分大
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年后,我在谷歌上搜索了它,它仍然是最好的答案!