2011-12-02 6 views
7

Ho alcuni JSON che ho bisogno di deserializzare così sto usando JavaScriptSerializer.DeserializeObject come:Utilizzo di JavaScriptSerializer.DeserializeObject in che modo è possibile recuperare un dizionario che utilizza un confronto tra stringhe senza distinzione tra maiuscole e minuscole?

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

Il problema è che il dizionario che ritorna ha un confronto principale tra maiuscole e minuscole, ma ho bisogno di caso- insensibile. C'è un modo per recuperare un dizionario che non fa distinzione tra maiuscole e minuscole?

EDIT: Preferirei non copiare i dati in una nuova struttura, poiché ho molti dati e questo sarà costoso.

risposta

10

È sufficiente creare un nuovo dizionario case sensitive e popolarlo con quello corrente.

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

[UPDATE] il codice Test:

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(); 

Il risultato è:

tempo Deserializtion: 1 min 21 sec

Dizionario ora di creazione: 3 sec

Quindi, il problema principale è la deserializzazione. La creazione del dizionario è di circa il 4%

+0

Grazie. Devo notare che mi piacerebbe davvero evitare di farlo. Avrò 500 GB di dati JSON (non tutti in un unico oggetto), ed evitare movimenti di dati extra, per risparmiare tempo, è una grande vittoria. Come ultima possibilità potrei doverlo fare, ma sono disposto a scrivere un bel po 'di codice per risparmiare tempo. –

+0

@Kang Su Dubito che si verifichino problemi di prestazioni con questo codice. La quantità di dati non è un problema. Il tempo aumenta con l'aumentare del numero di oggetti. Quante chiavi hai nel tuo dizionario? Ti consiglierei di testare questo codice prima della scrittura di un codice extra. – Egor4eg

+0

Probabilmente per un dato oggetto non più di 50 chiavi. Ma ci sono milioni di oggetti JSON, quindi dovrò farlo milioni di volte. Forse cercherò di scoprirlo, ma sarebbe bello se ci fosse un modo per ottenere un dizionario deserializzato senza distinzione tra maiuscole e minuscole. –

0

Si consiglia di creare una nuova classe che eredita da Dictionary<string, object> e nel costruttore di questa classe, assegnare il confronto senza distinzione tra maiuscole e minuscole. Non penso che possa essere serializzato da e verso JSON.