查询 BigQuery JSON 字段,其中所有键都已转义引号,而无需加载完整的 JSON 并替换转义字符

问题描述 投票:0回答:1

我有一个 BQ 表,其中包含可能非常大的 JSON 对象。我只需要每个 JSON 对象有一个属性(键:值对),因此我倾向于首先直接在管道中选择 JSON 属性,并避免读取整个 JSON 对象。但是,经过检查,我发现许多键包含转义引号(例如“content”:“{“Performance”:null,“RatabaseXML”:null})。其他字段没有这些转义引号,只有内容字段的键可以。

BQ 方法 JSON_EXTRACT 和 JSON_EXTRACT_SCALAR 不知道如何处理 \" 字符。

当键包含转义引号时,有没有办法选择这个 JSON 属性并提取我关心的属性?

这与这篇文章不同,后者重点关注其他地方的转义引号。此 JSON 确实从 https://jsonformatter.curiousconcept.com/#

返回为有效

我现在尝试的每一次尝试都在使用替换(下面的示例)周围摇摆。然而理想情况下我不想这样做,因为这会将整个有效负载对象作为字符串读取,然后对其进行替换,因为出于性能原因我想绕过它并只查询我关心的属性.

WITH json_sample AS (
  SELECT
    '{"applicationName": "familycarservice", "content": "{\"Performance\": "cats", \"RatabaseXML\": null}' AS payload
)
SELECT
  JSON_EXTRACT_SCALAR(
    REPLACE(REPLACE(payload, '\\"', '"'), '"{', '{'),
    '$.content.Performance'
  ) AS Performance
from json_sample;

json google-bigquery json-extract
1个回答
0
投票

我不明白,为什么要从 JSON 中删除引号?这将使它无效。我认为你担心的是一个不存在的问题。 BQ 中不存在带引号的字符串。 SQL 通常使用撇号来表示字符串 (

'
)。这意味着引号(
"
)完全有效地存在并且是字符,它们不是表示字符串,而是字符串的部分

此外,BQ 不支持

\"
是完全正常的,因为不需要转义合法字符。当然 https://jsonformatter.curiousconcept.com/# 会说它是有效的,因为这就是有效的 JSON 的样子。通过删除所有引号,您将使其无效,并可能使本机函数甚至无法解析它。

此外,考虑到 3 年后,您将使用可能需要此 JSON 的新系统。现在您“清理了它们”(因此使它们无效,使其无法使用),未来可能的应用程序将无法使用此 JSON。

至于“that”帖子,那是一个完全不同的故事。这适用于 JS,其中字符串由引号定义,并且需要转义。

如果您检查 any 的 JSON_ 函数(我随机选择 EXTRACT)的文档,您会看到它们证实了我所说的内容,并且每个示例都使用引号,因为这就是应该完成的方式。 Big Query 所需的任何成员显然都是字符串,因此与撇号一起使用。

文档中的示例证实了我所说的一切:

SELECT
  JSON_EXTRACT(JSON '{"class": {"students": [{"id": 5}, {"id": 12}]}}', '$.class')
  AS json_data;

简而言之:保留 JSON 不变,正常使用 BigQuery JSON_* 函数。无论是谁告诉你“清理”JSON 有效负载,都是错误的。如果您仍然对我所说的或文档有疑问,请尝试一下,然后告诉我它是否不起作用。如果没有,则可能是向您发送 JSON 的应用程序存在问题,或者是数据库中接收或处理 JSON 的方式存在问题,或者是存储方式存在问题。但在正常情况下,上述所有解释都应该成立。

© www.soinside.com 2019 - 2024. All rights reserved.