2011-12-02 5 views
7

Tengo algunos JSON que necesito para deserializar así que estoy usando JavaScriptSerializer.DeserializeObject como:Usando JavaScriptSerializer.DeserializeObject ¿cómo puedo recuperar un Dictionary que usa un comparador de cadenas insensible a mayúsculas y minúsculas?

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

El problema es que el diccionario que viene de atrás tiene un comparador de claves entre mayúsculas y minúsculas, pero necesito caso- insensible. ¿Hay alguna forma de recuperar un diccionario que no distingue entre mayúsculas y minúsculas?

EDITAR: Preferiría no copiar los datos a una nueva estructura, ya que tengo una gran cantidad de datos y esto será costoso.

Respuesta

10

Simplemente cree un nuevo diccionario insensible a mayúsculas y cuébelo con el actual.

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

[ACTUALIZACIÓN] Código prueba:

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

El resultado es:

tiempo Deserializtion: 1 min 21 sec

Diccionario creación tiempo: 3 seg

Entonces, el problema principal es la deserialización. La creación del diccionario es aproximadamente el 4%

+0

Gracias. Debo señalar que realmente me gustaría evitar hacer eso. Tendré 500 GB de datos JSON (no todos en un solo objeto), y evitar el movimiento de datos extra, para ahorrar tiempo, es una gran victoria. Como último recurso, quizás tenga que hacerlo, pero estoy dispuesto a escribir un poco de código para ahorrar tiempo. –

+0

@Kang Su. Dudo que tenga problemas de rendimiento con este código. La cantidad de datos no es un problema. El tiempo se incrementa al aumentar el número de objetos. ¿Cuántas teclas tienes en tu diccionario? Recomiendo que pruebe este código antes de escribir código adicional. – Egor4eg

+0

Probablemente para cualquier objeto dado no más de 50 claves. Pero hay millones de objetos JSON, así que tendré que hacer esto millones de veces. Tal vez lo intente y lo descubra, pero estaría bien si hubiera alguna manera de obtener un diccionario deserializado que no distinga mayúsculas de minúsculas. –

0

Recomendaría crear una nueva clase que herede de Dictionary<string, object> y en el constructor de esta clase, asignar el comparador insensible a mayúsculas y minúsculas. No creo que pueda ser serializado desde y hacia JSON.

Cuestiones relacionadas