web-dev-qa-db-ja.com

JSonスキーマと継承

Javaバインディングと継承)を使用してjsonスキーマを検索しましたが、すべての検索で「allOf」を使用することになりました。

AllOfを使用すると問題が解決する可能性がありますが、jsonスキーマに使用できる構造があり、それによってJavaコードと実数Java =継承 "B extends A" -B内のAからすべてのプロパティをインライン化するのではなく?

私はこれがサポートされている/実行可能であるかどうか疑問に思っていますか、それとも私はただ夢を見ています。サポートされていない場合は、理由を知りたいと思います。

18
user3748879

OK、まあ、私は両方の作者です:

  • 現在のJSONスキーマ検証仕様。
  • そしてJavaライブラリはJava今日: json-schema-validator でJSONスキーマ検証に最も使用されています。

だから私はあなたの質問に答えることができます、そして基本的な答えはノーです。

どうして?現在定義されているスキーマ継承のようなものがないためです。

allOfを使用する場合、allOf内のすべてのスキーマが一致する必要があります。また、このJSONまたはそのJSONに何が存在するかについて厳密な場合は、additionalPropertiesfalseに追加します。そのため、継承することはできません。

本当の解決策は、ドラフトv5で提案したメカニズムです。$mergeおよび$patchキーワード。これらにより、RFC7386またはRFC6902のいずれかでスキーマにパッチを適用し(詳細については ここ を参照)、実際にスキーマの継承を実装できます。

要するに:

  • additionalPropertiesfalseに設定し、基本的なJSONがオブジェクトである場合、追加のオブジェクトメンバーを定義することはできません。
  • これらの2つの新しいキーワードを使用すると、次のことができます。
22
fge

" jsonschema2pojo "プロジェクトには、この目的のための表記が含まれています。

JSONスキーマには、次のようなものを含めてください。

"extendsJavaClass" : "com.somecompany.SomeBaseClass",

つまり.

{
  "title": "....",
  "description": "....",
  "type": "object",
  "extendsJavaClass" : "com.somecompany.SomeBaseClass",
  "properties": {
    "...": {
      "items": {
        "$ref": "#/definitions/...."
      },
      "type": "array"
    }
    .......
}

その場合、プロジェクトによって生成されたクラスには、「extends」句があります。

/**
 * ...
 * <p>
 * ...
 * 
 */
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
    ...
})
public class MyNewClass
    extends SomeBaseClass
{
...
}

また、 ここ で同様の表記を検索できます。

PS:これらの表記は「標準のJSONスキーマ構造」ではありません。これらは、標準的な方法が可能になるまで、「 実行するだけ "」のために追加されます。

それが役に立てば幸い..

3
myuce