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 字符串上抛出错误

是否可以查询列表元素?

Redshift Postgresql - 如何解析嵌套的 JSON

修复 SQL 中的无效 json