【问题标题】:row_to_json exports "NULL" as "None"row_to_json 将“NULL”导出为“None”
【发布时间】:2020-03-02 14:43:00
【问题描述】:

我需要将表行导出为 JSON 并将其存储在审计表中,该表随后由 .NET 应用程序读取和反序列化。 Postgres 中有一个函数可以做到这一点:

row_to_json(..)

我的问题是 NULL 值被导出为“None”而不是“null”:

{'id': 'a55fe32b-e113-46a2-b54a-444a15922846', 'description': 'Some description'}
{'id': '195e4926-da42-453a-bb3f-789a823b22c0', 'description': 'Some other description'}
{'id': '31f2a08c-ac18-4579-ad5d-08d7f74557de', 'description': None}

反序列化自然会失败,除非我手动创建一些逻辑来将 None 替换为 null,但为什么看起来我是唯一遇到此问题的人?我已经搜索了一个答案,并看到了几个示例,其中 null 按预期从 row_to_json 函数返回,而其他人显然没有这个问题。

我错过了什么?

EDIT:我也将布尔值大写(False 而不是 false - 这是直接无效的 JSON。有些东西不是我的 row_to_json(..) 版本完全正确...

编辑 2:我正在使用带有 Postgres 扩展 (microsoft.azuredatastudio-postgresql) 的 Azure Data Studio。结果证明这是罪魁祸首,其他客户端按预期工作并返回 null

【问题讨论】:

  • with t(x,y) as (values(1, null::text)) select row_to_json(t) from t; 和结果:{"x":1,"y":null} 你能提供可重现的例子吗?
  • 如果我运行同样的查询,我会得到:{'x': 1, 'y': None} 这就是我的意思,它一定与我的 Postgres 配置(或版本?)有关。但在我在工作中可以访问的生产数据库中也是如此。
  • @Abelisto 刚刚在 Postgres 版本 9.6.3 上运行了相同的查询,结果相同 ({'x': 1, 'y': None})。
  • Returning None 看起来你是从一些 python 方法\代码调用脚本,使用 SQL Alchemy 之类的东西。看起来您正在将 json obj 转换为 python dict。如果是这样的话,这就是 None 的来源。
  • 我怀疑您正在使用将 JSON null 转换为 None 的客户端 API 或编程语言。请标记并描述您使用的语言和 API。

标签: json postgresql azure


【解决方案1】:

感谢 @Laurenz Albe 的评论,我尝试在不同的客户端中运行查询。该错误位于 Azure Data Studio 的 Postgres 扩展中,其他客户端 (DataGrip) 按预期返回 null

【讨论】:

    【解决方案2】:

    根据您想要实现的目标,json_strip_nulls 函数将删除任何包含空值的字段。下面是一个例子:

    SELECT json_strip_nulls(your_json)
    FROM (select row_to_json(row) your_json from (select * from <your_table>) row) p
    

    【讨论】:

    • 谢谢,这可行,但如果有另一种方法来修复 json 导出,那就太复杂了。
    猜你喜欢
    • 2012-04-14
    • 2020-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2016-05-31
    • 2017-02-04
    • 2013-09-05
    • 1970-01-01
    相关资源
    最近更新 更多