【问题标题】:Escaping Characters in Bigquery json_extract() functionBigquery json_extract() 函数中的转义字符
【发布时间】:2016-06-20 23:48:23
【问题描述】:

使用 Google 的 BigQuery 时,有一个 function 可以使用 jsonPath 从 json 字符串中提取元素。例如:

SELECT JSON_EXTRACT(data,"$.key.value") AS feature FROM tablename

当 json 键本身包含一个点时,{"key.value":"value"} 不清楚如何正确转义。

这个jsonpathmessage board question说jsonpath本身支持这种格式

@Test 
public void path_with_bracket_notation() throws Exception { 
    String json = "{\"foo.bar\": {\"key\": \"value\"}}"; 

    Assert.assertEquals("value", JsonPath.read(json, "$.['foo.bar'].key")); 

但是在 bigquery 中,这种类型的转义尝试会导致 Error: JSONPath parse error 错误。

【问题讨论】:

  • 我不确定双重转义是否可以通过 Web 界面、查询解析器、jsonpath 和函数进行。试试这个例子:SELECT JSON_EXTRACT('{"foo": {"key": "value"}}', '$.foo') AS str, JSON_EXTRACT('{"foo.bar": {"key": "value"}}', '$.foo.bar') AS str2; 使用 \\ 不会通过解析器。
  • @NorbertvanNobelen 问题中的 \ 只是用于创建示例 JSON 有效负载的 Java 语法,而不是实际 jsonpath 本身的一部分。

标签: json google-bigquery


【解决方案1】:

更新,新答案:

BigQuery 的 JSON_EXTRACTJSON_EXTRACT_SCALAR 函数现在支持 JSONPath 中的 JSON 括号表示法,因此以下查询有效:

SELECT JSON_EXTRACT('{"key.value": {"foo": "bar"}}', "$['key.value']")

然后返回

{"foo":"bar"}

旧的,现在已经过时的答案:

不幸的是,BigQuery 不支持转义 json 路径中的特殊字符。解决方法是使用 REPLACE 函数将点转换为下划线,即

SELECT 
  json_extract(
    replace('{"key.value":"value"}',
    'key.value',
    'key_value'),
  '$.key_value')

【讨论】:

  • 这是一个非常危险的解决方法,因为它还会替换 JSON 其余部分中的任何“key.value”,从而有效(可能)污染有效负载......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多