我有一些需要反序列化的 JSON,所以我使用 JavaScriptSerializer.DeserializeObject,例如:
var jsonObject = serializer.DeserializeObject(line) as Dictionary<string, object>;
问题是返回的字典有一个区分大小写的键比较器,但我需要不区分大小写。有没有办法找回不区分大小写的字典?
编辑:我不希望将数据复制到新结构,因为我有很多数据,这将是昂贵的。
我有一些需要反序列化的 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%
我建议创建一个继承自该类的构造函数的新类,Dictionary<string, object>
并在该类的构造函数中分配不区分大小写的比较器。我认为它不能与 JSON 进行序列化。