programing

$ref 사용에 관한 JSON 스키마

powerit 2023. 3. 29. 21:57
반응형

$ref 사용에 관한 JSON 스키마

$ref는 URI를 json 스키마로 가져가서 사용하는 것으로 알고 있습니다만, $ref : "#"은 어디를 가리키는 것입니까?이 블록 레벨에 대해 현재 스키마를 사용한다는 의미입니까?아니면 루트 레벨 ID에 정의된 루트레벨 스키마를 사용한다는 뜻인가요?감사해요.

편집: 다음 항목이 있는 경우:

"items": {
        "anyOf": [
            { "$ref": "#" },
            { "$ref": "#/definitions/schemaArray" }
        ],
        "default": {}
    }

id 필드가 없기 때문에 먼저 루트 스키마를 사용하여 인스턴스 항목의 유효성을 검사하고 실패하면 정의 스키마에 정의된 schemaArray 스키마를 사용하여 유효성을 검사합니다.

이 설정을 다음과 같이 변경할 경우:

 "items": {
            "id" : "#/items",
            "anyOf": [
                { "$ref": "#" },
                { "$ref": "#/definitions/schemaArray" }
            ],
            "default": {}
        }

그러면 배열의 첫 번째 서브헤마는 항목 스키마 자체를 가리킵니다.

편집 #2: 그럼 다음 조건을 충족하면:

 "items": {
        "id" : "itemSchema",
        "anyOf": [
            { "$ref": "#" },
            { "$ref": "#/definitions/schemaArray" }
        ],
        "default": {}
    }

그리고.

"stringArray": {
        "type": "array",
        "items": { "$ref" : "itemSchema" },
        "minItems": 1,
        "uniqueItems": true
    }

"string Array"의 "items" 필드는 위의 "itemsSchema"에 대해 검증됩니다.

또한 'anyOf'의 두 번째 $ref는 루트로 이동한 후 해당 스키마에 도달할 때까지 경로를 통과하여 작동합니까?감사합니다!

OK: 각$ref완전한 URI로 해결됩니다.이 작업이 완료되면 다음과 같은 질문을 통해 모든 질문에 답변할 수 있습니다.단순히 URI를 가져오면 어떤 스키마를 갖게 됩니까?어디서?$ref로딩 방법, 이 모든 것은 관련이 없습니다.해결된 URI에 전적으로 의존합니다.

라이브러리는 문서를 한 번만 가져오도록 캐싱하거나 다른 스키마를 "대화"하도록 한 스키마를 신뢰하는 것과 같은 몇 가지 바로 가기를 사용할 수 있지만, 모두 구현 세부 정보입니다.

첫 번째 질문에 대한 답변:

#특별한 것은 아닙니다.$ref현재 문서(또는 가장 가까운 값)에 대한 URI로 해결됩니다."id"(있는 경우).

따라서 사용하지 않은 경우"id",그리고나서#스키마 문서의 루트를 가리킵니다.에서 스키마를 가져온 경우http://example.com/schema, 그 후 a.{"$ref": "#"} 해결할 수 있는 내부 어디든지http://example.com/schema#문서 그 자체입니다.

사용할 때 다릅니다."id"그 이유는 이 명령어가 '기본' 스키마를 변경하기 때문입니다.$ref해결되었습니다.

{
    "type": "array",
    "items": {
        "id": "http://example.com/item-schema",
        "type": "object",
        "additionalProperties": {"$ref": "#"}
    }
}

이 예에서는$ref로 해결하다.http://example.com/item-schema#JSON Schema 셋업이 이미 가지고 있는 스키마를 신뢰하는 경우 "항목"의 값을 다시 사용할 수 있습니다.

하지만 요점은 에 대해 특별한 것이 없다는 것이다.#- 다른 URI와 마찬가지로 해결됩니다.

EDIT 1에 대한 응답:

첫 번째 예가 맞습니다.

하지만 두 번째는 아쉽게도 그렇지 않아요이는 URI에 대해 fragment 해결이 기능하기 때문입니다.즉, 1개의 fragment가 다른 fragment를 완전히 대체합니다.이 문제를 해결하면# "id"의 의 값#/items 것이 아닙니다.#/items- - 하다 - 하다# 에서는 의 첫 "anyOf"는 첫 번째 예시와 같이 문서의 루트로 계속 해결됩니다.

EDIT 2에 대한 응답:

가 합니다.http://example.com/my-schema의 URI 풀 , 2개의 URI 풀 URI.$refs:

  • http://example.com/itemSchema#
  • http://example.com/itemSchema#/definitions/schemaArray

첫 번째 에서는 라이브러리가 이미 가지고 있는 스키마를 사용할 수 있지만 URI를 보면 그렇지 않을 수 있습니다.http://example.com/my-schema정확한 표현은 신뢰받지 못할 수 있다http://example.com/itemSchema.

itemSchema', 'itemSchema'가 안요."definitions" ", ", "로 $ref전혀 문제가 해결되지 않습니다.

언급URL : https://stackoverflow.com/questions/17595377/json-schema-regarding-use-of-ref

반응형