Bir

2014-06-20 14 views
6

dışında bir çok özel özellik kümesi nasıl yapılır Bir JSON Şeması içinde tanımlamaya çalıştığım eski bir API'm var ve nesnenin 4 özellikli bir kümenin bulunduğu garip bir yapısı var. gerekli ve 3 tanesi birbirini dışlayan. Bundan sonra 30'dan fazla paylaşılan isteğe bağlı özellik vardır, ben onları ... olarak not edeceğim. Ben oneOf yapabileceğini ama bu foo başkalarıyla mevcut olmasına izin vermezBir

{ "foo": "bar", "baz": 1234, ... } // OK 
{ "foo": "bar", "buzz": 1234, ... } // OK 
{ "foo": "bar", "fizz": 1234, ... } // OK 
{ "foo": 1234, ... }    // OK 
{ "baz": 1234, ... }    // OK 
{ ... }        // NOT OK 
{ "baz": 1234, "buzz": 1234, ... } // NOT OK 

örn

, anyOfbaz, buzz ve fizz için değil hangi birbirleriyle mevcut olmasını sağlar mümkün.

{ 
    "type": "object", 
    "properties": { 
     "foo": {"type": "string"}, 
     "baz": {"type": "number"}, 
     "buzz": {"type": "number"}, 
     "fizz": {"type": "number"} 
    }, 
    "anyOf": [ 
     {"required": ["foo"]}, 
     {"required": [{"oneOf": [ 
       {"required": ["baz"]}, 
       {"required": ["buzz"]}, 
       {"required": ["fizz"]} 
      ]} 
     ]}    
    ] 
} 

ve

{ 
    "type": "object", 
    "properties": { 
     "foo": {"type": "string"}, 
     "baz": {"type": "number"}, 
     "buzz": {"type": "number"}, 
     "fizz": {"type": "number"} 
    }, 
    "anyOf": [ 
     {"required": ["foo"]}, 
     {"oneOf": [ 
       {"required": ["baz"]}, 
       {"required": ["buzz"]}, 
       {"required": ["fizz"]} 
      ] 
     }    
    ] 
} 

Ama bu işe yaramazsa ve ben sadece json şeması hakkında yeterince bilgimiz yok henüz bu mümkün olmadığını bilmek:

aşağıdaki gibi bir şey tanımlamak için çalıştı .

cevap

11

İlginç! Orada daha düzgün çözüm olabilir, ama burada biz

"birbirini dışlayan" kısıt

ikili özelliklerin kombinasyonları yasaklayarak ifade edilebilir ... gidebileceğini:

{ 
    "not": { 
     "anyOf": [ 
      {"required": ["baz", "buzz"]}, 
      {"required": ["buzz", "fizz"]}, 
      {"required": ["fizz", "baz"]} 
     ] 
    } 
} 

kısıtlaması "en az bir" anyOf ifade edilebilecek kadar: sadece tek bir şema içine bu iki kısıtlamaları birleştirirseniz

{ 
    "anyOf": [ 
     {"required": ["foo"]}, 
     {"required": ["baz"]}, 
     {"required": ["buzz"]}, 
     {"required": ["fizz"]} 
    } 
} 

, o zaman çalışması gerekir:

{ 
    "not": {"anyOf": [...]}, 
    "anyOf": ... 
} 
+1

Bu sayede bana saatlerce süren kafa çizme ve öfke kazandırdı. Siz bir dubai otel çatısında hanımefendi ile 5000 dolarlık bir yemeği hak ediyorsunuz. Çok teşekkürler! – dimitarvp

2

JSON Şeması'nda ikili olarak hariç tutmayı kullanarak özellikleri birbirinden dışlayıcı hale getirebilirsiniz, ancak bu, birleşik patlamaya neden olur. Birden çok karşılıklı münhasır mülkünüz olduğunda bu sorun olur.

Doğrusal bir çözelti formdadır:

  • tesisinde
  • özelliği b
  • mülkiyet C
  • herhangi bir:
    • arasında

      • bir özellik bir
      • mülkiyet b
      • mülkiyet C

birçok özelliklere sahip Bu sadece kapalı öder.

{ "oneOf": [ 
    { "required": ["baz"] }, 
    { "required": ["buzz"] }, 
    { "required": ["fizz"] }, 
    { "not": 
    { "anyOf": [ 
     { "required": ["baz"] }, 
     { "required": ["buzz"] }, 
     { "required": ["fizz"] } 
    ] } 
    } 
] } 

Özel sorunuzu yanıtlamak için bunu @ cloudfeet'in yanıtıyla birleştirin.

+1

Bu muhtemelen en iyi cevaptır. – Devin