我无法在包含'[]'作为数据的字段上调用json_extract_path_text(my_field,'some_key')。
它是一个有效的JSON字符串,但此函数只是抛出一个错误。
错误:JSON解析错误
细节:
错误:JSON解析错误
代码:8001
context:无效的json对象[]
查询:0
location:funcs_json.h:117
这个问题有什么好的解决方法吗?我可以添加一个AND my_field != '[]'
检查,但是谁知道还需要检查什么?
答案 0 :(得分:0)
这似乎是最近更改了json_extract_path_text函数的结果,它在数组上失败。
正如Craig所指出的,从技术上讲,错误是正确的,因为这是一个数组,而不是一个json对象。
您可能想要使用json_extract_array_element_text('json string',pos),如下所示:
json_extract_path_text(json_extract_array_element_text(my_field, 0), 'some_key')
但是如果你的数据是对象和数组的混合,那么也会失败,同时技术上也是正确但真正令人讨厌的错误
"context: invalid json array object {"somekey":"somevalue"}"
当然,这些失败的美妙之处在于,单个出局也会扼杀整个查询。一种解决方法可能是UDF,例如:
create or replace function f_extract_if_list (j varchar(max))
returns varchar(max)
stable
as $$
import json
if not j:
return None
try:
parsed_j = json.loads(j)
except ValueError:
return ''
if isinstance(parsed_j, dict):
return j
if isinstance(parsed_j, list) and len(parsed_j) >= 1:
return json.dumps(parsed_j[0])
return ''
$$ language plpythonu;
检查项目是否为数组,如果是,则返回该数组的第一个元素。可能需要进行一些调整,具体取决于您的具体用例。
有关UDF的更多信息,请访问:http://docs.aws.amazon.com/redshift/latest/dg/user-defined-functions.html
无论哪种方式,我也在AWS论坛上发布了一些相关内容: https://forums.aws.amazon.com/thread.jspa?messageID=728647&
希望有所帮助!
答案 1 :(得分:0)
帮助我将null_if_invalid设置为true
您的尝试:
json_extract_path_text(my_field, 'some_key')
尝试一下:
json_extract_path_text(my_field, 'some_key',**TRUE**)