Преобразование многострочного отступа JSON в одну строку с использованием JavaScript - PullRequest
0 голосов
/ 26 апреля 2011

Я придумал следующую функцию для преобразования многострочного, с хорошим отступом json в одну строку

function(text) {
    var outerRX = /((?:".*?")|(\s|\n|\r)+)/g,
        innerRX = /^(\s|\n|\r)+$/;

    return text.replace(outerRX, function($0, $1) {
        return $1.match(innerRX) ? "" : $1 ;
    });
}

Может ли кто-нибудь придумать что-то лучшее, как с точки зрения эффективности, так и с точки зрения исправления ошибок, которые существуют в моей реализации (например, разрывы при разборе

)
{
    "property":"is dangerously
             spaced out" 
}

или

{
    "property":"is dangerously \" punctuated" 
}

Ответы [ 2 ]

2 голосов
/ 26 апреля 2011

Для такого рода проблем я следую пословице, что добавление регулярного выражения только дает вам две проблемы.Это достаточно простая проблема синтаксического анализа, поэтому вот решение для синтаксического анализа:

var minifyJson = function (inJson) {
  var outJson, // the output string
      ch,      // the current character
      at,      // where we're at in the input string
      advance = function () {
        at += 1;
        ch = inJson.charAt(at);
      },
      skipWhite = function () {
        do { advance(); } while (ch && (ch <= ' '));
      },
      append = function () {
        outJson += ch;
      },
      copyString = function () {
        while (true) {
          advance();
          append();
          if (!ch || (ch === '"')) {
            return;
          }
          if (ch === '\\') {
            advance();
            append();
          }
        }
      },
      initialize = function () {
        outJson = "";
        at = -1;
      };

  initialize();
  skipWhite();

  while (ch) {
    append();
    if (ch === '"') {
      copyString();
    }
    skipWhite();
  }
  return outJson;
};

Обратите внимание, что в коде нет проверки ошибок для проверки правильности формирования JSON.Единственная ошибка (без закрывающих кавычек для строки) игнорируется.

0 голосов
/ 26 апреля 2011

Это исправляет две ошибки в вопросе, но, вероятно, не очень эффективно

function(text) {
    var outerRX = /((?:"([^"]|(\\"))*?(?!\\)")|(\s|\n|\r)+)/g,
    innerRX = /^(\s|\n|\r)+$/;

    return text.replace(outerRX, function($0, $1) {
        return $1.match(/^(\s|\n|\r)+$/) ? "" : $1 ;
    });
}
...