Обрабатывается ли json с двойными кавычками в Presto по-другому?

Используя Presto SQL, исходный формат столбца выглядит следующим образом "{\"ORDERS (completed)\": 1000.00, \"ORDERS (failed) USD\": 3000.00}", и я пытаюсь извлечь ключ и значение путем анализа и приведения к карте (varchar, double), а затем отсоединения

UNNEST(
    CAST(JSON_PARSE(json) as MAP<VARCHAR, DOUBLE>)
) x(key, value)

Когда я использую json_parse, косая черта и кавычки исчезают, но я получаю сообщение об ошибке (ожидается объект json) при попытке привести к map<varchar, double>{"ORDERS (filled)": 1000.00, "ORDERS (succeeded) USD": 3000.00}

Я также пробовал использовать формат JSON, но получил аналогичную ошибку. "{\"ORDERS (completed) USD\": 1000.0}" "\"{\\\"ORDERS (failed) USD\\\": 3000.0}\""

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
123
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Решение моей проблемы:

cast(json_parse(replace(substr(col, 2, length(col) - 2), '\', '')) as map<varchar, double>)

Мы хотим быть осторожными и не удалять все двойные кавычки, чтобы json_parse работал, нам нужны только двойные кавычки, окружающие строку json. Поэтому мы используем substr(col, 2, length(col) - 2), чтобы получить строку внутри кавычек. Нам нужно будет заменить косую черту на '', чтобы json_parse конвертировалось в json. Тогда мы можем использовать json_parse и cast as map<type, type> как обычно.

Ответ принят как подходящий

Ваш JSON — это строка, содержащая закодированный JSON (по сути, это JSON с двойной кодировкой), поэтому ее однократный анализ не поможет. Более правильным подходом было бы выполнить двойной анализ:

with dataset(col) as (
    values ('"{\"ORDERS (completed)\": 1000.00, \"ORDERS (failed) USD\": 3000.00}"')
)

select cast(
           json_parse(
               json_extract_scalar(
                   json_parse(col), '$')) as map(varchar, double))
from dataset;

Что дает следующий результат:

                          _col0                          
---------------------------------------------------------
 {ORDERS (failed) USD=3000.0, ORDERS (completed)=1000.0} 

это сработало и определенно лучшее решение, чем то, что я сделал, большое спасибо!

James Kong 29.04.2024 23:05

Другие вопросы по теме