2017-10-27 34 views
7

Biorąc pod uwagę ten obiekt JSON:JSONSchema i walidacji sub-object Właściwości

{ 
    "objects": { 
     "foo": { 
      "id": 1, 
      "name": "Foo" 
     }, 
     "bar": { 
      "id": 2, 
      "name": "Bar" 
     } 
    } 
} 

Jest to obiekt zawierający podrzędnych obiektów, gdzie każdy sub obiekt ma taką samą strukturę - wszystkie są tego samego typu. Każdy pod-obiekt jest unikatowo kluczowany, więc działa jak tablica nazwana.

Chcę sprawdzić, czy każdy obiekt należący do właściwości objects sprawdza poprawność względem odwołania do schematu JSON.

Jeśli właściwość objects się tablicę, na przykład jako:

{ 
    "objects": [ 
    { 
     "id": 1, 
     "name": "Foo" 
    }, 
    { 
     "id": 2, 
     "name": "Bar" 
    } 
    ] 
} 

mogę potwierdzić to z definicji schematu takie jak:

{ 
    "id": "my-schema", 
    "required": [ 
    "objects" 
    ], 
    "properties": { 
    "objects": { 
     "type": "array", 
     "items": { 
     "type": "object", 
     "required": [ 
      "id", 
      "name" 
     ], 
     "properties": { 
      "id": { 
      "type": "integer" 
      }, 
      "name": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

Osiąga ponieważ type jest array i to pozwala na walidację items.

Czy można zrobić coś podobnego, ale z obiektami zagnieżdżonymi?

Dzięki!

Odpowiedz

3

Można spróbować czegoś takiego:

{ 
    "id": "my-schema", 
    "type": "object", 
    "properties": { 
    "objects": { 
     "type": "object", 
     "patternProperties": { 
     "[a-z]+": { 
      "type": "object", 
      "properties": { 
      "id": { 
       "type": "integer" 
      }, 
      "name": { 
       "type": "string" 
      } 
      }, 
      "additionalProperties": false, 
      "required": [ 
      "id", 
      "name" 
      ] 
     } 
     } 
    } 
    } 
} 
0

Powyższa odpowiedź pracuje ograniczenie nazwy właściwości obiektów do małych liter. Jeśli nie trzeba ograniczać nazwy własności, to jest prostsze:

{ 
    "id": "my-schema", 
    "type": "object", 
    "properties": { 
    "objects": { 
     "type": "object", 
     "additionalProperties": { 
     "type": "object", 
     "properties": { 
      "id": { 
      "type": "integer" 
      }, 
      "name": { 
      "type": "string    } 
      } 
     }, 
     "required": [ 
      "id", 
      "name" 
     ] 
     } 
    } 
    } 
} 

pominąłem wewnętrzną "additionalProperties": false z powyższej odpowiedzi, ponieważ uważam, że przy użyciu tego słowa kluczowego powoduje więcej problemów niż rozwiązuje, ale jest to prawidłowe użycie słowa kluczowego, jeśli chcesz, aby sprawdzanie poprawności zakończyło się niepowodzeniem na obiektach wewnętrznych, jeśli mają one właściwości inne niż "nazwa" i "identyfikator".