2015-10-29 2 views
2

Я читал RFC, касающиеся указателей JSON Schema и JSON, но я все еще пытаюсь понять, как правильно ссылаться на другие документы.

Допустим, у меня есть следующие файлы (на диске):

/foo/bar/schema/base.json 
/foo/bar/schema/model/model.json 

base.json так:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "/schema/base", 
    "title": "Base Response", 
    "description": "Schema descriptions of common properties of a response", 
    "type": [ "object" ], 

    "definitions": { 
    "data": { 
     "descrpition": "The response data is encapsulated within here", 
     "example": "true", 
     "type": [ "object", "array", "boolean", "null" ] 
    } 
    }, 

    "properties": { 
    "data": { "$ref" : "#/definitions/data" } 
    } 
} 

Файл model.json что-то вроде этого:

{ 
    "$schema": "http://json-schema.org/draft-04/schema#", 
    "id": "/schema/model/model", 
    "type": "object", 

    "$ref": "/schema/base.json" 
} 

Значение $ ref в model.json - это то, о чем я прошу. Мое понимание стандарта заключалось в том, что между id и $ ref документа мы должны найти документ.

В качестве альтернативы, я задавался ли что-то вроде:

"$ref": "../../base.json" 

бы работать?

Но ни одно из этих решений не работает, используя либо Python, либо библиотеки PHP, которые я пробовал. Я не уверен, где я ошибаюсь?

ответ

3

Прежде всего, различные библиотеки решаются по-разному, поэтому вам нужно будет следовать их конкретной документации, чтобы выяснить точные детали. Но ниже приведена общая информация о разрешении $ref, которое может оказаться полезным.

Подумайте о своем документе схемы как веб-странице, которую вы просматриваете в браузере. id представляет URL-адрес в строке URL вашего браузера. Это должен быть абсолютный нормализованный URL-адрес, как и в вашем браузере.

{ 
    "id": "file:///path/to/project/foo/bar/schema/model/model.json" 
} 

Придумайте $ref как ссылку на веб-странице, которую вы просматриваете в браузере. In может быть абсолютным или относительным, как в вашем браузере. Относительный $ref будет решать те же правила, что и ссылка на веб-странице. Например, я ожидал бы, что все $ref s в следующем JSON будут разрешены к одному и тому же значению. (Примечание.. Она не действительна использовать более чем один $ref Это только для иллюстрации)

{ 
    "id": "file:///path/to/project/foo/bar/schema/model/model.json", 
    "$ref": "file:///path/to/project/foo/bar/schema/base.json", 
    "$ref": "/path/to/project/foo/bar/schema/base.json", 
    "$ref": "../model.json" 
} 

Если id нет, то URI используется для получения схемы следует считать быть id , В этом случае file:///path/to/project/foo/bar/schema/model/model.json.

Вот как это должно работать с высокого уровня, но реализации различаются в том, как они реализуют это. Некоторые требуют, чтобы библиотека была настроена определенным образом. Например, используемый мною валидатор PHP требует, чтобы вы зарегистрировали все свои схемы в SchemaStore, прежде чем они смогут ссылаться.

Код: http://json-schema.org/latest/json-schema-core.html#anchor27

+0

Отличное объяснение - спасибо. Я думаю, что основная часть, на которую я упала, - это значение поля ID, а также тонкости данных библиотек. –

Смежные вопросы