如何修剪Postgres的JSON数据类型中的空格?

时间:2014-05-30 18:59:39

标签: json postgresql postgresql-9.2 postgresql-9.3

当我这样做时:

SELECT cast('{"viewport" : {               "northeast" : {                  "lat" : 40.7155809802915,                  "lng" : -73.9599399197085               },              "southwest" : {                  "lat" : 40.7128830197085,                  "lng" : -73.96263788029151               }            }}' AS json);

我明白了:

"{"viewport" : {               "northeast" : {                  "lat" : 40.7155809802915,                  "lng" : -73.9599399197085               },              "southwest" : {                  "lat" : 40.7128830197085,                  "lng" : -73.96263788029151               }            }}"

我想将它转换为没有空格或更少空格的东西。像这样:

"{"viewport" : {"northeast" : {"lat" : 40.7155809802915, "lng" : -73.9599399197085 }, "southwest" : { "lat" : 40.7128830197085, "lng" : -73.96263788029151 }}}"

2 个答案:

答案 0 :(得分:2)

SELECT cast(replace('{"viewport" : {               "northeast" : {                  "lat" : 40.7155809802915,                  "lng" : -73.9599399197085               },              "southwest" : {                  "lat" : 40.7128830197085,                  "lng" : -73.96263788029151               }            }}', ' ', '') AS json);

产量

{"viewport":{"northeast":{"lat":40.7155809802915,"lng":-73.9599399197085},"southwest":{"lat":40.7128830197085,"lng":-73.96263788029151}}}

然而,我本以为演员会完成这个!此外,如果任何键名称中有空格,则会失败。

更新了关键或值中潜在空格问题的答案:

SELECT cast(regexp_replace('{"viewport here" : {               "northeast there" : {                  "lat" : 40.7155809802915,                  "lng" : -73.9599399197085               },              "southwest" : {       "iggy and":    "squiggy or something",           "lat" : 40.7128830197085,                  "lng" : -73.96263788029151               }            }}', '( )(?=(?:[^"]|"[^"]*")*$)', '', 'g') AS json);

返回

{"viewport here":{"northeast there":{"lat":40.7155809802915,"lng":-73.9599399197085},"southwest":{"iggy and":"squiggy or something","lat":40.7128830197085,"lng":-73.96263788029151}

}}

这是postgres文档: http://www.postgresql.org/docs/9.3/static/functions-matching.html

这是我在这个特定的正则表达式上找到的堆栈溢出: Regex to pick commas outside of quotes

@lpsmith:确实,在9.4中这有效:

SELECT cast('{"viewport here" : {               "northeast there" : {                  "lat" : 40.7155809802915,                  "lng" : -73.9599399197085               },              "southwest" : {       "iggy and":    "squiggy or something",           "lat" : 40.7128830197085,                  "lng" : -73.96263788029151               }            }}' AS jsonb);

产生这个:

{"viewport here": {"southwest": {"lat": 40.7128830197085, "lng": -73.96263788029151, "iggy and": "squiggy or something"}, "northeast there": {"lat": 40.7155809802915, "lng": -73.95

99399197085}}}

-g

答案 1 :(得分:2)

我目前还没有特别注意postgresql中的任何json打印机。您可以实现适当的服务器端功能,这不应该太困难。但在您将应用程序插入数据库之前解析并在应用程序中打印json可能是最好的。

重要的是要记住json类型只是一个字符串,在概念上有一个检查约束,确保它实际上是有效的json语法。这就是全部。因此,postgresql本身内部的json操作可能效率很低。

随着jsonb类型进入postgresql 9.4将解决你的问题,因为它不存储json本身,而是一个更适合有效操作的抽象表示。因此,存储jsonb值将忘记任何无关的空格,并且您可能会返回从打印机生成的最小json字符串。