JavaScript:如何从JSON字符串中删除除值中的空格以外的所有空格?

22
{"name": "John", "age": 30, "city": "New York"}
给定以下JSON...
var body = "{ \"name\": \"test\", \"description\": \"test json\", \"website\": \"domain.com\" }"

如何除了值中的空格之外,移除所有的空格?

我尝试了以下正则表达式...

var body = "{ \"name\": \"test\", \"description\": \"test json\", \"website\": \"domain.com\" }".replace(/\r?\n|\r/g, "").replace(/\s+/g, "")

...但它也会删除值中的空格(例如description):

{"name":"test","description":"testjson","website":"domain.com"}

我需要获取

{"name":"test","description":"test json","website":"domain.com"}

Tx.


2
我认为你误解了JSON的要点,因为那不是JSON,是一个JavaScript对象。你需要使用JSON.stringify(body) - elclanrs
JSON.stringify(body)返回的是没有空格的字符串。在尝试从中删除空格之前,您是否尝试查看是否存在空格? - zerkms
@zerkms 嗯,那是标准/保证的行为吗? - user2864740
请不要在提问后一分钟内对问题进行根本性更改。这样做不好,会让我们为错误的问题编写正确答案,并让我们做双倍的工作。 - Niels Keurentjes
你为什么想要这样做?这完全没有关系。 - user663031
显示剩余2条评论
2个回答

28
var body = ' { "name": "test", "description": "test json", "website": "domain.com" } ';
JSON.stringify(JSON.parse(body))

返回:

{"name":"test","description":"test json","website":"domain.com"}

这正是您所需的。是的,JSON.stringify只带一个参数时保证给出最短的JSON字符串,意味着键和值之间没有过时的空格。这是默认设置,因为在几乎所有情况下,JSON都旨在成为高效的递归数据序列化方法 - 不必要的空白默认情况下没有用处。

全语法实际上是

JSON.stringify(value[, replacer [, space]])
可选的第三个参数默认为false。如果设置为其他值,则会生成带有额外空格或前导字符串的“漂亮打印”:

空格参数可用于控制最终字符串中的间距。 如果它是一个数字,则字符串化中的连续级别将每个缩进这么多个空格字符(最多10个)。 如果它是一个字符串,连续级别将由此字符串缩进(或其中的前十个字符)。

最后一点,您甚至不应该想要使用正则表达式进行此操作。正则表达式用于从字符模式中提取信息,而不是用于处理像XML、HTML或JSON这样的结构化数据。在这些情况下,请分别使用XML、DOM或JSON解析器并在其中处理结果。


我刚刚更新了我的帖子... 我得到了一个包含空格的JSON字符串... 所以调用stringify对我来说行不通。 - j3d
更新了答案。显然,首先要使用JSON.parse将其转换为有效对象,然后重新进行stringify - Niels Keurentjes

4

解析JSON,然后再将其字符串化。解析会将JSON转换为JavaScript对象,然后字符串化会返回最短的JSON表示:

var body = JSON.stringify(JSON.parse("{ \"name\": \"test\", \"description\": \"test json\", \"website\": \"domain.com\" }"));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接