Схема JSON с неизвестными именами свойств
Я хочу иметь схему JSON с неизвестными именами свойств в массиве объектов.
Хорошим примером являются метаданные веб-страницы:
"meta": {
"type": "array",
"items": {
"type": "object",
"properties": {
"unknown-attribute-1": {
"type": "string"
},
"unknown-attribute-2": {
"type": "string"
},
...
}
}
}
Любые идеи, пожалуйста, или другой способ достичь того же?
Ответы
Ответ 1
Используйте patternProperties
вместо properties
. В приведенном ниже примере regex соответствия шаблону .*
принимает любое имя свойства, и я разрешаю типы string
или null
только с помощью "additionalProperties": false
.
"patternProperties": {
"^.*$": {
"anyOf": [
{"type": "string"},
{"type": "null"}
]
}
},
"additionalProperties": false
Ответ 2
Вы можете создавать ограничения на свойства, которые явно не определены. Следующая схема обеспечивает "meta" как массив объектов, свойства которых имеют тип string:
{
"properties" : {
"meta" : {
"type" : "array",
"items" : {
"type" : "object",
"additionalProperties" : {
"type" : "string"
}
}
}
}
}
Если вы просто хотите иметь массив строк, вы можете использовать следующую схему:
{
"properties" : {
"meta" : {
"type" : "array",
"items" : {
"type" : "string"
}
}
}
}
Ответ 3
Решение @jruizaranguren работает для меня.
Хотя я тот же, кто определяет схему, я выбрал другое решение
"meta": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"value": {
"type": "string"
}
}
}
}
}
Я преобразовал объект в массив объектов с именем-значением
Пример действительного JSON:
"meta": [
[
{
"name": "http-equiv",
"value": "Content-Type"
},
{
"name": "content",
"value": "text/html; charset=UTF-8"
}
],
[
{
"name": "name",
"value": "author"
},
{
"name": "content",
"value": "Astrid Florence Cassing"
}
]
]