2016-08-26 8 views
2

データ:「言語」プロパティによって、ファイルプロパティにキーの名前を確認するスキーマを定義する方法Jsonスキーマ別のプロパティ値に基づいてプロパティキーを検証する方法は?

{ 
    "languages": ['en', 'ch'], 
    "file": { 
     "en": "file1", 
     "ch": "file2" 
    } 
} 

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "description": "", 
    "type": "object", 
    "properties": { 
    "languages": { 
     "type": "array", 
     "items": { 
     "type": "string" 
     } 
    }, 
    "file": { 
     "type": "object", 
     "properties": ???? 
    } 
} 

答えて

2

いくつかのバリデータでサポートされているカスタムキーワードを使用して、追加のデータ制約を定義することができます。 Ajv(私は著者午前):

var Ajv = require('ajv'); 
var ajv = new Ajv; 
ajv.addKeyword('validateLocales', { 
    type: 'object', 
    compile: function(schema) { 
     return function(data, dataPath, parentData) { 
      for (var prop in data) { 
       if (parentData[schema.localesProperty].indexOf(prop) == -1) { 
        return false; 
       } 
      } 
      return true; 
     } 
    }, 
    metaSchema: { 
     type: 'object', 
     properties: { 
      localesProperty: { type: 'string' } 
     }, 
     additionalProperties: false 
    } 
}); 

var schema = { 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "type": "object", 
    "properties": { 
    "languages": { 
     "type": "array", 
     "items": { "type": "string" } 
    }, 
    "file": { 
     "type": "object", 
     "validateLocales": { 
      "localesProperty": "languages" 
     }, 
     "additionalProperties": { "type": "string" } 
    } 
    } 
}; 

var data = { 
    "languages": ['en', 'ch'], 
    "file": { 
     "en": "file1", 
     "ch": "file2" 
    } 
}; 

var validate = ajv.compile(schema); 
console.log(validate(data)); 

https://runkit.com/esp/57d9d419646b97130082de34

+0

を参照してくださいどのように私は自分のファイル2つの以上のレベルの深置く必要がある場合は?例えば https://gist.github.com/Truedrog/201c34a1f9b119d1416eeff485b8c3cc – truedrog

+0

コンパイル関数schema.localesPropertyは 'languages'と等しく、私の言語配列のキーではないので、 'parentData [schema.localesProperty] .indexOf(prop)== - 1 'は未定義のエラーのためにチェックできませんでした。 – truedrog

+0

さて、私はルートデータの引数で私の問題を解決しました。v5プロポーザルの$ data referenceを使用することができますか? – truedrog

0

jsonスキーマでこのような制約を表現することは間違いありません。

関連する問題