2016-06-06 1 views
0

У меня возникли проблемы с вызовом json_extract_path_text (my_field, 'some_key') в поле, которое содержит '[]' в качестве данных.json_extract_path_text ('[]', 'some_key') выдает ошибку в действительной строке json

Это действительная строка JSON, но эта функция просто выдает ошибку.


ОШИБКА: JSON синтаксический ошибка

ДЕТАЛЬ:

ошибка: JSON синтаксический ошибка

код: 8001

контекст: недопустимый объект JSON []

запрос : 0

местоположение: funcs_json.h: 117


Есть ли хорошие решения этой проблемы? Возможно, я могу добавить проверку AND my_field != '[]', но кто знает, что еще нужно проверить?

+0

Вы действительно в Redshift? Является ли поле * whole * json ничего, кроме '[]', то есть json является единственным пустым массивом? Поскольку, если это так, массив не является json-объектом, пустым или иным, это массив. Вы не можете получить поле массива. –

+0

Пустой массив [] является допустимой строкой JSON из JSONLint, не так ли? –

+0

Да, '[]' является допустимым json * document *, но это не объект json *. Вы не можете искать ключ в массиве, они имеют только индексы. Тем не менее, PostgreSQL (по крайней мере, 9.5) позволяет это. Поэтому я предполагаю, что это проблема с красным смещением. –

ответ

0

Это, по-видимому, результат недавнего изменения функции json_extract_path_text, где он не работает на массивах.

Как указывает Крейг, технически ошибка правильная, так как это массив, а не объект json.

Вы можете захотеть использовать json_extract_array_element_text («JSON строку», позы), как в:

json_extract_path_text(json_extract_array_element_text(my_field, 0), 'some_key') 

Но если ваши данные представляют собой сочетание объектов и массивов, это также завершаться одинаково -technically-правильно-но-очень-просто-раздражающая ошибка

"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&

Надежда, что помогает!

Смежные вопросы