使用javascript将多行缩进的json转换为单行

时间:2011-04-26 13:51:18

标签: javascript regex json indentation

我想出了以下函数,用于将多线条,精确缩进的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 个答案:

答案 0 :(得分:2)

对于这类问题,我遵循这样的格言:添加正则表达式只会给你带来两个问题。这是一个简单的解析问题,所以这是一个解析解决方案:

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是否正确形成。唯一的错误(没有字符串的结束引号)将被忽略。

答案 1 :(得分:0)

这解决了问题中的两个错误,但可能效率不高

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 ;
    });
}