2012-01-18 3 views
25

У меня есть строка JSON с отступом, например.Минимизировать строку JSON с отступом в .NET.

{ 
    "a": 1 
} 

Однако, у меня нет тип экземпляра для сериализации или десериализации.

В моей ситуации, что это самый эффективный способ в Минимизировать строковым JSON? например

{"a":1} 

Я не против использования библиотек, если они готовы к производству.

ответ

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

должен это сделать. Он гарантирует, что строки, содержащие символы пробела, сохраняются, а все остальные символы пробега удаляются. Все ключевые слова JSON (false, true, null) должны быть разделены запятыми или другими пунктуациями, поэтому необходимо сохранить только белые пробелы внутри строк.


Первый вариант (\"(?:[^\"\\\\]|\\\\.)*\") соответствует строке с двойными кавычками. (...) означает, что выход фиксируется и доступен при замене как $1. [^\"\\\\] соответствует любому символу, кроме символа двойной кавычки или escape-кода \.

Поскольку соответствие происходит слева направо, второй вариант, \s+ не будет соответствовать пробелу внутри строки.

Таким образом, мы сопоставляем целые строки и пробелы вне строк. В первом случае $1 является символом строки, а в последнем случае $1 является пустой строкой, потому что группа 1 не использовалась.


Это работает как задумано, потому что

  1. только лексемы в формате JSON, которые могут содержать пробелы в двойных кавычках. В JSON нет ни капли строк, ни комментариев.
  2. JSON-грамматика требует односимвольной пунктуации между всеми символами многосимвольного символа, поэтому удаление пространства не будет сливать токены. В JavaScript это может быть проблематично, потому что пространство должно ломать токены; var x=0 отличается от varx=0 и x - -(y) отличается от x--(y).
Смежные вопросы