2016-03-07 85 views
3

當使用Google的BigQuery,有一個function可以使用jsonPath從json字符串中提取元素。例如:在Bigquery中跳轉字符json_extract()函數

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

當JSON密鑰本身包含一個圓點,{"key.value":"value"}目前尚不清楚如何逃脫正常。

這jsonpath message 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中的這種類型的espcaping嘗試引起Error: JSONPath parse error錯誤。

+0

我不知道雙轉義作品通過Web界面,查詢分析器,jsonpath和功能。試試這個例子:'SELECT JSON_EXTRACT('{「foo」:{「key」:「value」}}','$ .foo')AS str, JSON_EXTRACT('{「foo.bar」:{「key」 :「value」}}','$ .foo.bar')AS str2;' 使用\\不通過解析器。 – Ereli

+0

@NorbertvanNobelen在問題中的\是創建示例JSON負載的Java語法,而不是實際的jsonpath本身的一部分。 – hraban

回答

2

更新,新的答案:

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') 
+0

這是相當危險的解決方法,因爲它也會替換JSON其餘部分中的任何「key.value」,從而有效地(可能)污染有效負載... – hraban