stringify/ приведение jsonb к строке с надежным пробелом для хэша в postgresql, аналогичном JSON.stringify
Я хочу создать функцию хеширования для полей jsonb, но мне нужно контролировать приведение к строке, чтобы обеспечить целостность клиента и сервера. Другими словами, я хотел бы структурировать JSON как на клиенте, так и на сервере с одинаковым интервалом и отступом.
Например, этот запрос:
SELECT '{"tags":["tag1","tag2"],"c":1}' ::JSONB ::TEXT
вернусь:
{"c": 1, "tags": ["tag1", "tag2"]}
Теперь, кроме заказа ключей (что идеально), вот интересная часть. Ставит пробелы после двоеточия (:
), по сравнению с JSON.stringify
на клиенте:
{"tags":["tag1","tag2"],"c":1}
Обратите внимание, что после двоеточия нет пробелов. Заказ ключей можно сделать с помощью чего-то вроде json-stable-stringify
,
В идеале мы можем контролировать вывод на сервере... Я нашел в исходном коде функцию, которая выглядит так, как будто она используется для приведения JSONB к строке: функция JsonbToCString
который возвращает JsonbToCStringWorker
и, похоже, есть аргументы для управления интервалами и отступами https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/jsonb.c#L430
Есть ли в любом случае выставить эти методы аналогично тому, как вы можете вызывать функции в psql? Что-то вроде SELECT json_to_string( ..., indent )
, Я счастлив использовать ::TEXT
метод приведения, но похоже, что строковое кодирование немного жестко запрограммировано, и я не могу передать опции отступа.
Заранее спасибо за помощь!