json_extract_path_text('[]','some_key')在有效的json字符串

时间:2016-06-06 14:33:25

标签: json postgresql amazon-redshift

我无法在包含'[]'作为数据的字段上调用json_extract_path_text(my_field,'some_key')。

它是一个有效的JSON字符串,但此函数只是抛出一个错误。

错误:JSON解析错误

细节:

错误:JSON解析错误

代码:8001

context:无效的json对象[]

查询:0

location:funcs_json.h:117

这个问题有什么好的解决方法吗?我可以添加一个AND my_field != '[]'检查,但是谁知道还需要检查什么?

2 个答案:

答案 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**)