从 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 对象中删除空格,但不在引号内的主要内容,如果未能解决你的问题,请参考以下文章