2016-12-15 9 views
1

У меня есть эта родительская схема:Json Схемы - Как сделать anyOf два или более свойств требуется

{ 
    "definitions": { 
     "parcel": { 
      "type": "object", 
      "properties": { 
       "id": { 
        "type": "string" 
       }, 
       "accountNumber": { 
        "type": "string" 
       }, 
       "parcelNumber": { 
        "type": "string" 
       }, 
       "propertyType": { 
        "type": "string" 
       }, 
       "address": { 
        "$ref": "address.json#/definitions/address" 
       }, 
       "coordinates": { 
        "$ref": "coordinates.json#/definitions/coordinates" 
       } 
      }, 
      "required": ["accountNumber", "parcelNumber"] 
     } 
    } 
} 

Ниже приведены ссылки суб-схема:

{ 
    "definitions": { 
     "address": { 
      "type": "object", 
      "properties": { 
       "addressString": { 
        "type": "string", 
        "addressType": { 
         "enum": ["residential", "business"] 
        } 
       }, 
       "required": ["addressString"] 
      } 
     } 
    } 
} 

    { 
    "definitions": { 
     "coordinates": { 
      "type": "object", 
      "properties": { 
       "latitude": { 
        "type": "number" 
       }, 
       "longitude": { 
        "type": "number" 
       }, 
       "projection": { 
        "type": "string" 
       } 
      }, 
      "required": ["latitude ", "longitude", " projection"] 
     } 
    } 
} 

Я хочу, чтобы применить следующие условия к родительской схеме.

  1. Любой адрес или координаты или оба они предусмотрены.
  2. Это не должно быть подтверждено, если не указаны ни адрес, ни координаты.
+0

Маленький комментарий: Вы могли бы используйте единый объект определения в вашей схеме, содержащий все три подсхемы. Им не нужно находиться в отдельных объектах. –

+0

Другая проблема: я думаю, что ваше свойство «id» принадлежит к «свойствам» –

ответ

2

Ваше решение anyOf. Вы можете сделать это немного очистителя путем разделения фиксированных требуемых свойств (ACCOUNTNUMBER и parcelNumber) от anyOf группы свойств:

{ 
    "type": "object", 
    "required": [ 
    "accountNumber", 
    "parcelNumber" 
    ], 
    "anyOf": [ 
    {"required" : ["address"]}, 
    {"required" : ["coordinates"]} 
    ], 
    "properties": { 
    "id": { 
     "type": "string" 
    }, 
    "accountNumber": { 
     "type": "string" 
    }, 
    "parcelNumber": { 
     "type": "string" 
    }, 
    "propertyType": { 
     "type": "string" 
    }, 
    "address": { 
     "type": "object", 
     "properties": { 
     "addressString": { 
      "type": "string" 
     }, 
     "addressType": { 
      "enum": [ 
      "residential", 
      "business" 
      ] 
     } 
     }, 
     "required": [ 
     "addressString" 
     ] 
    }, 
    "coordinates": { 
     "type": "object", 
     "properties": { 
     "latitude": { 
      "type": "number" 
     }, 
     "longitude": { 
      "type": "number" 
     }, 
     "projection": { 
      "type": "string" 
     } 
     }, 
     "required": [ 
     "latitude", 
     "longitude", 
     "projection" 
     ] 
    } 
    } 
} 

Вот суть для справки:

http://jsonschemalint.com/#/version/draft-05/markup/json?gist=f36d9a7e080c4d25dbbf09b7dd03137e

+0

Спасибо, это помогает, выглядит очень чисто! –

+0

Рад, что это было полезно! –

0

Вот как я реализовал решение.

"anyOf": [{ 
    "required": ["accountNumber", "parcelNumber", "coordinates"] 
}, { 
    "required": ["accountNumber", "parcelNumber", "address"] 
}]