Почему " additionalProperties` - это способ представления словаря / карты в Swagger / OpenAPI 2.0
хотя я видел примеры в OpenAPI spec:
type: object additionalProperties: $ref: '#/definitions/ComplexModel'
это не очевидно для меня почему использование additionalProperties правильная схема на карте/словарь.
Это также не помогает, что единственная конкретная вещь, которую спецификация должна сказать о additionalProperties - это:
следующие свойства взяты из определения схемы JSON, но их определения были скорректированы на Swagger Спецификация. Их определение совпадает с определением из схемы JSON, только если исходное определение ссылается на определение схемы JSON, вместо этого используется определение объекта схемы.
- предметы
- все
- свойства
- additionalProperties
2 ответов
Чен, я думаю,ваш ответ является правильным.
некоторые дополнительные сведения, которые могут быть полезны:
в JavaScript, который был исходным контекстом для JSON, объект похож на хэш-карту строк для значений, где некоторые значения являются данными, другие-функциями. Можно рассматривать каждую пару имя-значение как свойство. Но JavaScript не имеет классов, поэтому имена свойств не предопределены, и каждый объект может иметь свой собственный независимый набор свойства.
схема JSON использует properties ключевое слово для проверки пар имя-значение, которые известны заранее; и использует additionalProperties (или patternProperties, не поддерживается в OpenAPI 2.0) для проверки свойств, которые не известны.
для ясности:
- имена свойств или" ключи " на карте должны быть строками. Это не могут быть числа или любое другое значение.
- как вы сказали, имена свойств должны быть уникальным. К сожалению Спецификация JSON строго не требует уникальности, но уникальность рекомендуется и ожидается большинством реализаций JSON. Больше фона здесь.
-
propertiesиadditionalPropertiesможно использовать отдельно или в комбинации. Когда additionalProperties используется отдельно, без свойств, объект по существу функционирует какmap<string, T>где T является типом, описанным в подразделе схемы additionalProperties. Возможно, это поможет ответить на ваш первоначальный вопрос. - когда оценка объекта по одной схеме, если имя свойства совпадает с одним из указанных в
properties, его стоимость должна быть действительна на суб-схеме предусмотрено, что собственность. TheadditionalPropertiesвложенная схема, если она указана, будет использоваться только для проверки свойств, которые не входит вpropertiesкарта. - есть некоторые ограничения
additionalPropertiesкак реализовано в основных библиотеках Java Swagger. Я задокументировал эти ограничения здесь.
Первое, что я нашел лучшее объяснение additionalProperties:
для объекта, если это задано, в дополнение к свойствам, определенным в
propertiesвсе остальные имена свойств, не допускаются. Их значения должны соответствовать приведенному здесь Объекту схемы. Если это не задано, никаких других свойств, кроме тех, которые определены вpropertiesразрешено.
так вот как я понял этот:
используя properties, мы можем определите известный набор свойств, подобных в Python namedtuple, однако, если мы хотим иметь что-то более похожее питона дикт, или любой другой хэш / карта, где мы не можем указать, сколько ключей есть и что они заранее, мы должны использовать additionalProperties.
additionalProperties будет соответствовать любому имени свойства (которое будет действовать как и $ref или type будет схемы dictзначение, и так как не должно быть более одного свойства с одинаковым именем для каждого данного объекта, мы получим принудительное применение уникальных ключей.
обратите внимание, что в отличие от Python dict который принимает любое неизменяемое значение в качестве ключа, так как ключи здесь по сути являются именами свойств, они должны быть строками. (Спасибо Тэд Эпштейн за это разъяснение). Это ограничение можно отследить до pair := string : value на спецификация json.