从 JSON 对象中删除空格,但不在引号内

Posted

技术标签:

【中文标题】从 JSON 对象中删除空格,但不在引号内【英文标题】:Remove white space from JSON object, but not within quotes 【发布时间】:2015-10-08 17:22:35 【问题描述】:

所以我有一个input[type="text"],我想在其中粘贴 JSON 对象作为配置。控制台中的输出是完美的,所有内联都没有任何修剪,但现在input 我有很多间距。我想去掉那个间距并替换 input 值。

示例

$('#widget-json').on('input propertychange', function () 
    var string = this.value.replace(/\s+/g, ''),
        data = $.parseJSON( string );

    $(this).val( string );
);

这几乎可以完成这项工作,但它也消除了引号内的间距。因此,如果我有一个像 "sentence": "Sure thing, good to go." 这样的键/值,它将被转换为 "sentence":"Surething,goodtogo.",而我想在引号内保留空格。

JSON 对象示例


    "widget-effect": 3,
    "widget-opacity-color": "#C7C9CF",
    "widget-opacity-slider": "50%",
    "widget-opt-close": false,
    "widget-opt-scroll": true,
    "widget-opt-totop": true,
    "widget-text": "Spacing required within quotes"

所需的输出示例

"widget-effect":3,"widget-opacity-color":"#C7C9CF","widget-opacity-slider":"50%","widget-opt-close":false,"widget-opt-scroll":true,"widget-opt-totop":true,"widget-text": "Spacing required within quotes"
我试过了,jQuery.trim( this.value ),但根本没用。 我试过了,this.value.replace(/\s+/g, '') 并删除了整个空格,即使在引号内也是如此。我知道这可能是正确的结果,但我不知道如何仅在引号之外将其删除。

我假设可以安装该正则表达式来跳过替换引号内的空格,但我一点也不熟悉。

【问题讨论】:

解析并重新序列化。 实际期望的行为是什么? 【参考方案1】:

使用正则表达式交替运算符。

var s = '"sentence": "Sure thing, good to go."';
alert(s.replace(/("[^"]*")|\s/g, "$1"))

上面的正则表达式实际上是做什么的?

("[^"]*") 捕获所有双引号块。所以在上面,"sentence""Sure thing ..." 被捕获(意味着这个特定部分将被存储到索引为 1 的临时缓冲区中)。

|

\s 匹配剩余字符串中的所有空格字符。所以不会碰到之前匹配的部分。

替换部分中的$1指的是第一个捕获组捕获的所有字符。因此,第一个捕获组中的字符被保留,匹配的空格被删除。

更新:

不幸的是,当您转义字符串值中的引号时,正则表达式会中断并停止删除剩余键/值对的空格

var stri = `"sentence \\"with escaped quotes\\" should not break": "Sure thing, good to go."`;
alert(stri.replace(/("(?:\\"|[^"])*")|\s/g, "$1"));

【讨论】:

非常感谢阿维纳什。这正是我想要的。 嗨阿维纳什。不幸的是,当您在字符串的值中转义引号时,正则表达式会中断并停止删除剩余键/值对的空格。我一直在尝试对捕获组中的尾随引号应用否定的lookbehind,但这会引发字符串中的空格被消耗,因为由于某种原因它不考虑开始引号。如果你能想出一个改进的版本,那就太好了【参考方案2】:

尝试使用JSON.stringify

$("#widget-json").on("input propertychange", function () 
    // var string = this.value.replace(/\s+/g, ''),
    var data = JSON.stringify($.parseJSON( this.value ));
    $(this).val( data );
);

var data = 
    "widget-effect": 3,
    "widget-opacity-color": "#C7C9CF",
    "widget-opacity-slider": "50%",
    "widget-opt-close": false,
    "widget-opt-scroll": true,
    "widget-opt-totop": true,
    "widget-text": "Spacing required within quotes"
;

document.write(JSON.stringify(data));

【讨论】:

我明白了……很高兴知道。 +1 虽然我会“标记为正确”@Avinash_Raj 的回答。因为我询问了可能的方法并想知道如何使用正则表达式。

以上是关于从 JSON 对象中删除空格,但不在引号内的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式选择所有不在引号中的空格?

json对象中的变量存在空格的取值办法

MS SQL Server 在空格上拆分单词,但仅在不在双引号中时

用空格和冒号分割字符串,但如果在引号内则不分割

删除 JSON 键中的前导和尾随空格

从 JSON 字符串中删除所有缩进和空格,除了它在 Ruby 中的值之外