【问题标题】:Javascript templating double quotesJavascript模板双引号
【发布时间】:2016-01-11 09:48:10
【问题描述】:

我有一个问题,我的文件包含表单中的对象

Dog1: {
  information: {
    color: 'red',
    name: 'Tom'
  }
}

我正在构建一个程序,它会自动从文件中填充我的对象,但当前输出的格式为

"Dog1": {
  "information": {
    "color": "red",
    "name": "Tom"
  }
}

我的问题是我需要在“red”和“Tom”周围加上单引号或双引号,但其他所有内容都不需要。我曾尝试使用 jscodeshift,但似乎无法正常工作。有人对此有什么建议吗?

非常感谢您的宝贵时间,乔

【问题讨论】:

  • 后一种是标准的JSON,前一种是javascript表达式。 Javascript 将同样解析后者。为什么需要前一种格式?如何生成对象?
  • 我正在开发一个更大的系统,我只想保持相同以保持一致性,但它也需要通过验证检查。虽然它们都是有效的,但我的系统需要第一个,但我想不出一种方法来做到这一点,这不是一个肮脏的黑客。
  • 所以你在 javascript 中有这些对象,并试图将其序列化为给定格式的字符串(并可能将其发送到服务器)?您是如何生成第二个输出的?
  • newText = JSON.stringify(newParameter); 然后是一个文件,它只是一个新文本的 concat,我们使用美化来很好地格式化beautify(newDestFile, { indent_size: 2, unescape_strings: true, jslint_happy: true });
  • 旁注:JSON.stringify(newParameter, null, 4) 会进行格式化

标签: javascript jscodeshift


【解决方案1】:

您的对象是 JavaScript 对象,对吧? 然而,对象被写入文件,它似乎是以 JSON 格式编写的 (JavaScript Object Notation)。

在我看来,这并没有错。这是存储 JavaScript 对象的正确方法。如果您真的不想要引号,您可能需要实现自己的逻辑来将对象写入文件。

更新:JSON.Stringify without quotes on properties?。那家伙也有同样的问题,解决办法是在调用 JSON.stringify() 后去掉引号。

【讨论】:

  • 我正在开发一个需要这种格式的大型系统,您是否建议我编写自己的逻辑或正则表达式来解决这个问题?
  • 我不知道您使用什么框架或库将对象写入文件中。但是如果它将对象保存为 JSON,而您不想要 JSON,则可能需要更改一些配置,或者实现自己的逻辑。
  • 暂时只使用stringify和beautify(格式化)
  • 好的。也许这有帮助? stackoverflow.com/questions/11233498/…
  • 看起来金黄的!我会试一试,看看会发生什么
【解决方案2】:

我快速为你实现了一个自定义的 json 序列化器:

function _serialize_object_key(key) {
  return /^[a-zA-Z_\$][a-zA-Z_\$0-9]*$/.test(key) ? key : JSON.stringify(key);
}
function _serialize_object(obj, opts, current_indent) {
  var arr = [], inner_indent = current_indent + opts.indent_inc;
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      arr.push(inner_indent + _serialize_object_key(key) + ': ' + _json_like_stringify(obj[key], opts, inner_indent));
    }
  }
  return '{\n' + arr.join(',\n') + '\n' + current_indent + '}';
}

function _serialize_array(arr, opts, current_indent) {
  var inner_indent = current_indent + opts.indent_inc;
  return '[\n' + inner_indent + arr.map(inner_map).join(',\n' + inner_indent) + '\n' + current_indent + ']';
  function inner_map(x) {
    return _json_like_stringify(x, opts, inner_indent);
  }
}

function _json_like_stringify(x, opts, current_indent) {
  switch (typeof x) {
    case "number":
    case "string":
    case "boolean":
    default:
      return JSON.stringify(x);
    case "object":
      if (x === null) return 'null';
      if (Array.isArray(x)) return _serialize_array(x, opts, current_indent);
      return _serialize_object(x, opts, current_indent);
  }
}

function json_like_stringify(x, indent) {
  if (indent === undefined) indent = 2;
  var indent_inc = '';
  for (var i = 0; i < indent; i++) indent_inc += ' ';
  return _json_like_stringify(x, {indent_inc:indent_inc}, '');
}

$('pre').text(json_like_stringify({a:[1,2,3],b:{c:{d:[6,7,"asdasda\"fgdfgdfg",true,null, [1, 2, 3, {' ':' '}, 5, 6, 7, 8, 9, 10, 11]]}}}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre></pre>

【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多