Richtiger Weg, um ein Array von Aufzählungen im JSON-Schema zu definieren


71

Ich möchte mit JSON-Schema-Array beschreiben, das aus null oder mehr vordefinierten Werten bestehen sollte. Um es einfach zu machen, lassen Sie uns haben diese möglichen Werte: one, twound three.

Richtige Arrays (sollten die Validierung bestehen):

[]
["one", "one"]
["one", "three"]

Falsch:

["four"]

Jetzt weiß ich, dass die "enum"Eigenschaft verwendet werden sollte, aber ich kann keine relevanten Informationen finden, wo sie abgelegt werden soll.

Option A (unter "items"):

{
    "type": "array",
    "items": {
        "type": "string",
        "enum": ["one", "two", "three"]
    }
}

Option B:

{
    "type": "array",
    "items": {
        "type": "string"
    },
    "enum": ["one", "two", "three"]
}

Antworten:


92

Option A ist korrekt und entspricht Ihren Anforderungen.

{
    "type": "array",
    "items": {
        "type": "string",
        "enum": ["one", "two", "three"]
    }
}

8

Laut json-schema Dokumentation müssen die aufgezählten Werte von a arrayin das "items"Feld aufgenommen werden:

{
    "type": "array",
    "items": {
        "type": "string",
        "enum": ["one", "two", "three"]
    }
}

Wenn Sie eine haben array, die z. B. Elemente unterschiedlichen Typs enthalten kann, sollte Ihr Schema wie folgt aussehen:

{
  "type": "array",
  "items": [
    {
      "type": "string",
      "enum": ["one", "two", "three"]
    },
    {
      "type": "integer",
      "enum": [1, 2, 3]
    }
  ]
}

In diesem zweiten Beispiel darf das Array nicht zwei verschiedene Typen enthalten. Es ist die Tupelvalidierung [1], bei der das erste und das zweite Element im Array so eingeschränkt werden, dass sie mit dem ersten und zweiten Schema im Array "Elemente" übereinstimmen. [1] json-schema.org/understanding-json-schema/reference/…
Graham Lea

2
Ich denke, das richtige Konstrukt für das zweite Beispiel ist wahrscheinlich anyOf: json-schema.org/understanding-json-schema/reference/…
Graham Lea
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.