Это, по-видимому, результат недавнего изменения функции 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&
Надежда, что помогает!
Вы действительно в Redshift? Является ли поле * whole * json ничего, кроме '[]', то есть json является единственным пустым массивом? Поскольку, если это так, массив не является json-объектом, пустым или иным, это массив. Вы не можете получить поле массива. –
Пустой массив [] является допустимой строкой JSON из JSONLint, не так ли? –
Да, '[]' является допустимым json * document *, но это не объект json *. Вы не можете искать ключ в массиве, они имеют только индексы. Тем не менее, PostgreSQL (по крайней мере, 9.5) позволяет это. Поэтому я предполагаю, что это проблема с красным смещением. –