json_extract_path_text('[]', 'some_key') 在有效的 json 字符串上抛出错误
Posted
技术标签:
【中文标题】json_extract_path_text(\'[]\', \'some_key\') 在有效的 json 字符串上抛出错误【英文标题】:json_extract_path_text('[]', 'some_key') throw an error on valid json stringjson_extract_path_text('[]', 'some_key') 在有效的 json 字符串上抛出错误 【发布时间】:2016-06-06 14:33:24 【问题描述】:在包含“[]”作为数据的字段上调用 json_extract_path_text(my_field, 'some_key')
时遇到问题。
这是一个有效的 JSON 字符串,但这个函数只是抛出一个错误。
-----------------------------------------------
ERROR: JSON parsing error
DETAIL:
error: JSON parsing error
code: 8001
context: invalid json object []
query: 0
location: funcs_json.h:117
-----------------------------------------------
对于这个问题有什么好的解决方法吗?我可能会添加一个AND my_field != '[]'
检查,但谁知道还需要检查什么?
【问题讨论】:
您真的在使用 Redshift 吗? 整个 json 字段除了[]
什么都没有,即json 是一个空数组吗?因为如果是这样,数组就不是 json 对象,无论是否为空,它都是一个数组。无法获取数组的字段。
空数组 [] 是来自 JSONLint 的有效 JSON 字符串,不是吗?
是的,[]
是一个有效的 json document,但它不是一个 json object。您不能在数组中查找键,它们只有索引。也就是说,PostgreSQL(至少 9.5)允许这样做。所以我猜这是一个红移问题。
【参考方案1】:
帮助我的是将 null_if_invalid 设置为 true
你的尝试:
json_extract_path_text(my_field, 'some_key')
试试这个:
json_extract_path_text(my_field, 'some_key',**TRUE**)
【讨论】:
【参考方案2】:这似乎是最近更改 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&
希望有帮助!
【讨论】:
以上是关于json_extract_path_text('[]', 'some_key') 在有效的 json 字符串上抛出错误的主要内容,如果未能解决你的问题,请参考以下文章
json_extract_path_text 转换为 int 错误
在 Redshift 中使用 json_extract_path_text 时如何跳过错误?
json_extract_path_text('[]', 'some_key') 在有效的 json 字符串上抛出错误