Как ограничить количество полей, которые может содержать полученный json?

#postgresql #go

#postgresql #Вперед

Вопрос:

Я создаю веб-сервер в Go, который получает JSON и отправляет его в базу данных (PostgreSQL), которая затем обрабатывает его и создает некоторые объекты. Что меня беспокоит, так это то, что количество полей в полученном JSON может быть огромным, например

 {
  "a":1,
  "b": 2,
  ...
}
  

И это потенциально может существенно повлиять на производительность базы данных. Есть ли готовое решение / пакет для решения этой проблемы, потому что я не хочу писать пользовательские json.Unmarshaler ?

Комментарии:

1. Да, проверьте входные данные перед записью их в базу данных. Это пользовательская логика, вам придется реализовать ее самостоятельно.

2. Начиная с 1.15, Go имеет ограничение на глубину структур JSON , но чтобы ограничить количество полей в объекте, вы должны написать свой собственный код. Если требуется разбор объекта на возможно огромную карту, вам нужно декодировать отдельные токены и прервать в какой-то момент. Однако гораздо проще ограничить размер входных данных , что, естественно, накладывает верхнюю границу и на размер карты.

3. @Peter Большое вам спасибо за прямой ответ на прямой вопрос, я ценю это!

Ответ №1:

Вы могли бы добавить ограничение проверки следующим образом:

 CHECK (cardinality(json_object_keys(jsoncol)) <= 30)
  

Это гарантирует, что существует не более 30 записей верхнего уровня. Конечно, каждая из этих записей может содержать вложенные, потенциально большие значения, но если ваши JSON выглядят так, как в вопросе, этого было бы достаточно.

Ответ №2:

[I] есть ли способ или решение для решения этой проблемы?

ДА. Вы должны проверить размер и прервать, если он слишком большой. Это можно сделать во время чтения запроса, при отмене сортировки JSON или перед помещением данных в базу данных. Все варианты включают в себя prgramming.

Комментарии:

1. Дело в том, что пользователь может отправлять json с короткими именами полей и значениями, что может привести к не слишком большому json, но количество полей может быть больше, чем я ожидаю.

2. @thisismamatto Тогда вы не можете ограничить уровень запроса, но должны ограничить уровень обработки JSON или уровень вставки базы данных. Оба просто должны быть выполнены вами , это не произойдет волшебным образом.