1

クライアントとサーバーの両方で任意の JSON を検証できるように、既存の (そして動作している) クライアント側の jQuery 検証スキーマを JSONSchema に移動しようとしています。

私のアプリケーションは本質的に、他の質問に対するユーザーの応答に基づいて、どの質問を行うべきかを決定する多くの複雑なロジックを備えた巨大なフォームの集まりです。各フォームには 200 以上のフィールドがあります。

現在、私はクライアント側の検証のみを行っており、約 99% の確率でうまく機能しています。ブラウザの問題が数回発生しましたが、壊滅的なものはありません. そうは言っても、サーバー側の検証を行いたい(!)。

JSONSchema ドラフトを読み、v3 実装のいくつかを参照した後、アプリケーションが依存するようになったより複雑なルールのいくつかを失う可能性があるようです。どこかの方向に進みすぎる前に、何かを見逃していないことを確認したいのです。

いくつかの例:

「x == 10 の場合、y が必要です。それ以外の場合はオプションです」

10 はリテラル値、列挙型などになる可能性がありますが、同じ構造内の別のフィールドを参照し、その値が存在するだけでなく、特定の型/値と同等であることを保証できる必要があります。

これは、JSONSchema リストのこのスレッドで対処されていると思います。

「x = 今日の日付、y = 明日の日付の場合、x > y」

このロジックは、「開始日」が「終了日」よりも前になるようにするために使用されます。

私が見ることができることから、このようなものは何もなく、それを行う唯一の方法は、新しく評価された JSON のチャンクをスキーマとして渡すことです。

上記のニーズを満たすために私が見つけた最も近いものはCERNYです。

間違ったツリーを鳴らしている場合は、お知らせください。また、クライアントとサーバーの両方で backbone.js を実行することも検討しています。

tl;dr;

大規模で複雑なフォーム用の一連の検証ルールを維持し、これらの検証ルールをクライアント側とサーバー側の両方で任意の JSON ドキュメントに適用したいと考えています。

4

1 に答える 1

0

多くのトリックがありますが、すべてが可能というわけではありません。たとえば、x == 10 の場合、y が必要である場合は、(ドラフト 3) のようなもので実現できます。

"type":[
{"properties":{"x":{"enum":[10]}, "y":{"required":true}}},
{"properties":{"x":{"disallow":[{"enum":[10]}]}}}
]

たとえば、それは可能ですが、非常にトリッキーです... スキーマは基本的に、コンテンツではなく構造を検証することになっています (このためのプロパティがほとんどない場合でも)

私が個人的に好きなもう 1 つの方法は、現在の検証グラフを外部 URL ベースのスキーマで「拡張」することです。アイデアは、現在のドキュメントのパラメーターをURLで送信し、それらのパラメーターに従って関連するスキーマを返すことです。

例:

{
"extends":{"$ref":"http://checkCustomValidity/{x}/{y}/"};
}

「実行時」に返されたスキーマは、{"disallow":"any"}許可されていない場合、または問題がない{}場合

URL はクライアント側とサーバー側の両方で使用できるため、これは便利です (クライアントは完全にスタンドアロンではありませんが、場合によってはそれができません)。

これの実際の使用法は、リモート サービスを使用する必要がある場合です。たとえば、登録中にニックネームがサーバーで既に使用されているかどうかを確認する必要がある場合。リクエスト パスに応答するサーバー側の Web サービスをコーディングします。http://www.server.com/isNicknameUsed/{nickname}

于 2012-01-31T19:16:03.343 に答える