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"
]
}

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:



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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.