Lassen Sie nur Eigenschaften zu, die im JSON-Schema deklariert sind

79

Ich verwende json-schema und möchte nur zulassen, dass Eigenschaften, die in dieser Datei deklariert sind, die Validierung bestehen. Wenn ein Benutzer beispielsweise eine "name" -Eigenschaft in seinem json-Objekt übergibt, schlägt dieses Schema fehl, da "name" hier nicht als Eigenschaft aufgeführt ist.

Gibt es eine ähnliche Funktion wie "erforderlich", mit der nur die aufgelisteten Eigenschaften übergeben werden können?

{
"$schema": "http://json-schema.org/draft-04/schema#",
"title": "Accounting Resource - Add Item",
"type": "object",
"properties": {
    "itemNumber": {
        "type":"string",
        "minimum": 3
    },
    "title": {
        "type":"string",
        "minimum": 5
    },
    "description": {
        "type":"string",
        "minimum": 5
    }
},
"required": [
    "itemNumber",
    "title",
    "description"
]
}
ipengineer
quelle
2
Selbst wenn es einen Weg gibt, scheint dies, als würde man die zukünftige Dehnbarkeit in den Fuß schießen.
Chris Pitman
9
Ich werde diese Eigenschaften jederzeit in Zukunft zu diesem Schema hinzufügen.
Ipengineer
1
@ipengineer - das funktioniert (-ish), solange Sie die Person sind, die die Erweiterung durchführt. Dies bedeutet auch, dass Sie eine Ressource ändern, von der einige Leute annehmen, dass sie statisch ist.
Wolkenfüße
11
Es gibt kein "-ish". Es ist nicht schwierig, Ihrem Schema neue Eigenschaften hinzuzufügen, wenn Ihre API in Zukunft neue Requisiten akzeptiert, unabhängig von der Größe Ihres Teams. Wenn ja, machen Sie wahrscheinlich etwas anderes falsch.
AJB

Antworten:

106

Ich glaube, was Sie tun müssen, um dies zu erreichen, ist additionalPropertiesfalsch. Siehe die Spezifikation hier

Jules
quelle
Im neuesten Entwurf: json-schema.org/latest/…
OneHoopyFrood
5

Zu Ihrer Information - es sieht so aus, als würde Version 5 des Standards einen Validierungsmodus "Verbot unbekannter Eigenschaften" beschreiben .

Anstatt diese Anforderung in das Format aufzunehmen (was, wie Chris Pitman in den Kommentaren sagt, die zukünftige Erweiterbarkeit beeinträchtigt), können Sie Ihren Prüfer einfach anweisen , unbekannte Eigenschaften als Fehler zu kennzeichnen. Es ist also wie ein sehr strenger Validierungsmodus, der für Entwickler nützlich ist.

Einige Validatoren unterstützen dies bereits (z. B. tv4 ):

var result = tv4.validateMultiple(data, schema, checkRecursive, banUnknownProperties);

Mit diesem Tool checkRecursivesollte es verwendet werden, wenn Ihre Daten möglicherweise Zirkelverweise enthalten und genau das banUnknownPropertiestun , was Sie möchten, ohne es verwenden zu müssen "additionalProperties":false.

Wolkenfüße
quelle
2

Geben Sie in Ihrer Definition Folgendes an:

  • alle erforderlichen Felder im Inneren "required": []
  • und setzen "additionalProperties": false

DEMO:

ohne "additionalProperties": false: Geben Sie hier die Bildbeschreibung ein

mit "additionalProperties": false: Geben Sie hier die Bildbeschreibung ein

Andilabs
quelle