2012-01-18 17 views
25

Mam ciąg znaków JSON z wcięciem, np.Uszkodzenie wciętego łańcucha JSON w .NET

{ 
    "a": 1 
} 

Jednak nie mam typ instancji być szeregowane lub rozszeregować.

W mojej sytuacji, jaka jest najskuteczniejszym sposobem do minify string JSON? na przykład

{"a":1} 

Nie mam nic przeciwko używaniu bibliotek, jeśli są gotowe do produkcji.

Odpowiedz

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

powinien to zrobić. Upewnia się, że łańcuchy zawierające znaki spacji są zachowane, a wszystkie pozostałe znaki spacji są odrzucane. Wszystkie słowa kluczowe JSON (false, , , null) muszą być oddzielone przecinkami lub inną interpunkcją, więc tylko białe spacje wewnątrz łańcuchów muszą zostać zachowane.


Pierwsza opcja (\"(?:[^\"\\\\]|\\\\.)*\") dopasowuje podwójny ciąg znaków. (...) oznacza, że ​​dane wyjściowe są przechwytywane i dostępne w zastępstwie jako $1. Znak [^\"\\\\] dopasowuje dowolny znak, z wyjątkiem podwójnego cudzysłowu lub znaku ewakuacyjnego \.

Ponieważ dopasowanie występuje od lewej do prawej, druga opcja, \s+, nie będzie pasowała do spacji w ciągu znaków.

Tak więc dopasowujemy całe łańcuchy i spacje na zewnątrz ciągów. W pierwszym przypadku token ciągowy, $1 jest tokenem łańcuchowym, aw drugim przypadku $1 jest pustym łańcuchem, ponieważ grupa 1 nie była używana.


ten działa zgodnie z przeznaczeniem, bo

  1. tylko tokeny w JSON, który może zawierać spacji są podwójnych cudzysłowów. W JSON nie ma pojedynczych cudzysłowów ani komentarzy.
  2. Gramatyka JSON wymaga interpunkcji pojedynczego znaku między wszystkimi tokenami wieloznakowymi, więc usunięcie miejsca nie spowoduje scalenia żetonów. W JavaScript może to być problematyczne, ponieważ do złamania tokenów wymagane jest miejsce; var x=0 różni się od varx=0 i x - -(y) różni się od x--(y).
Powiązane problemy