2016-12-15 47 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解决方案有效。您可以通过从anyOf属性组分离固定所需的性能(使用accountNumber和parcelNumber)使其干净了一点:

{ 
    "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"] 
}] 
相关问题