2012-01-18 20 views
25

Ho una stringa JSON rientrata ad es.Riduci stringa JSON con rientro in .NET

{ 
    "a": 1 
} 

Tuttavia, non ho il tipo dell'istanza da serializzare o deserializzare.

Nella mia situazione, qual è il modo più efficace a minify una stringa JSON? per esempio.

{"a":1} 

Non mi interessa usare le librerie se sono pronte per la produzione.

risposta

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

dovrebbe farlo. Si assicura che le stringhe che contengono i caratteri dello spazio siano conservate e tutti gli altri caratteri dello spazio vengano scartati. Tutte le parole chiave JSON (false, true, null) devono essere separate da virgole o altri segni di punteggiatura, pertanto è necessario conservare solo lo spazio bianco all'interno delle stringhe.


La prima opzione (\"(?:[^\"\\\\]|\\\\.)*\") corrisponde una stringa doppia citato. Il (...) significa che l'output viene catturato e disponibile nella sostituzione come $1. Lo [^\"\\\\] corrisponde a qualsiasi carattere tranne una virgoletta doppia o un carattere di escape \.

Poiché la corrispondenza si verifica da sinistra a destra, la seconda opzione, \s+ non corrisponde allo spazio all'interno di una stringa.

Quindi corrispondiamo a stringhe intere e spazi all'esterno delle stringhe. Nel primo caso, $1 è il token di stringa e, nel secondo caso, $1 è la stringa vuota perché il gruppo 1 non è stato utilizzato.


Questo funziona come previsto perché

  1. gli unici gettoni in JSON che possono contenere spazi sono stringhe tra doppi apici. Non ci sono stringhe o commenti con citazione singola in JSON.
  2. la grammatica JSON richiede la punteggiatura di un singolo carattere tra tutti i token multi-carattere, quindi la rimozione dello spazio non unirà i token. In JavaScript, questo potrebbe essere problematico perché lo spazio è necessario per rompere i token; var x=0 è diverso da varx=0 e x - -(y) è diverso da x--(y).