2012-01-18 21 views
25

Tengo una cadena JSON con sangría, p.Minificar cadena JSON con sangría en .NET

{ 
    "a": 1 
} 

Sin embargo, no tengo el tipo de la instancia se va a serializar o deserializar.

En mi situación, ¿cuál es la manera más eficiente a Minify una cadena JSON? p.ej.

{"a":1} 

No me importa usar bibliotecas si están listas para producción.

Respuesta

55
Regex.Replace(myJSON, "(\"(?:[^\"\\\\]|\\\\.)*\")|\\s+", "$1") 

debería hacerlo. Se asegura de que las cadenas que contienen caracteres de espacio se conservan, y todos los demás caracteres de espacio se descartan. Todas las palabras clave (JSON false, true, null) tienen que ser separados por comas o por lo que sólo otra puntuacion-espacio en blanco dentro de las cadenas necesita ser preservado.


La primera opción (\"(?:[^\"\\\\]|\\\\.)*\") coincide con una cadena entre comillas dobles. El (...) significa que la salida se captura y está disponible en el reemplazo como $1. El [^\"\\\\] coincide con cualquier carácter excepto una comilla doble o un carácter de escape \.

Desde coincidencia se produce de izquierda a derecha, la segunda opción, \s+ no coincidirá con el espacio dentro de una cadena.

Así que coinciden con cadenas enteras, y los espacios exteriores cuerdas. En el primer caso, $1 es el token de cadena, y en este último caso $1 es la cadena vacía porque no se utilizó el grupo 1.


Esto funciona según lo previsto, porque

  1. las únicas fichas en JSON que pueden contener espacios son cadenas entre comillas dobles. No hay cadenas sueltas ni comentarios en JSON.
  2. la gramática JSON requiere puntuacion de un solo carácter entre todas las fichas de varios caracteres, por lo que eliminar el espacio no se fusionará fichas. En JavaScript, esto podría ser problemático porque se requiere espacio para romper tokens; var x=0 es diferente de varx=0 y x - -(y) es diferente de x--(y).