Используя JavaScriptSerializer.DeserializeObject, как я могу получить словарь, который использует регистр строк без учета регистра? - PullRequest
8 голосов
/ 02 декабря 2011

У меня есть JSON, который нужно десериализовать, поэтому я использую JavaScriptSerializer.DeserializeObject, например:

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

Проблема в том, что в возвращаемом словаре есть регистр ключей с учетом регистра, но мне нужен регистр без учета регистра. Есть ли способ вернуть словарь без учета регистра?

РЕДАКТИРОВАТЬ: Я бы предпочел не копировать данные в новую структуру, так как у меня много данных, и это будет дорого.

Ответы [ 2 ]

10 голосов
/ 02 декабря 2011

Просто создайте новый словарь без учета регистра и заполните его текущим.

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%

0 голосов
/ 02 декабря 2011

Я бы рекомендовал создать новый класс, который наследуется от Dictionary<string, object>, и в конструкторе этого класса назначить регистр без учета регистра.Я не думаю, что его можно сериализовать в JSON и из него.

...