Некоторые вопросы, связанные с пользовательской схемой JSON - PullRequest
5 голосов
/ 20 ноября 2011

Я нуб к Джсону. Определяя формат результата моего RESTful API (а именно JSON), я чувствовал, что было бы проще документировать его как мою JSON-схему . При написании одного у меня было несколько вопросов:

  1. В моем результате JSON, как мне указать URI для схемы, которой он подтверждает? --edit-- он использует атрибут $schema?
  2. Существуют ли какие-либо соглашения / рекомендации для управления версиями схемы JSON? Есть ли какие-либо атрибуты, которые я должен / могу определить в моей схеме как атрибуты? Я вижу, Сама схема JSON не имеет определенной версии, кроме как в ее URI, указанном как значение ключа $schema.
  3. Могу ли я разбить мою одну БОЛЬШУЮ JSON-схему на несколько меньших и включить одну в другую? Как и #include в C ++, затем обратитесь к нескольким схемам в JSON, который я отправил пользователю как результат.
  4. Могу ли я определить пользовательское значение для ключа "тип"? Например. Я хотел бы повторно использовать определение «дата» следующим образом:

[игнорируйте эту строку, чтобы форматирование работало для следующего json ..]

{
    "date":{
        "type":"object",
        "properties":{
            "month":{
                "type":"integer",
                "minimum":1,
                "maximum":12
            },
            "year":{
                "type":"integer",
                "minimum":0
            }
        }
    },
    "personInfo":{
        "type":"object",
        "properties":{
            "name":{
                "type":"string"
            },
            "dateOfBirth":{
                "type":"date"
            }
        }
    },
    "student":{
        "type":"object",
        "properties":{
            "id":{
                "type":"personInfo"
            },
            "pass_out_year":{
                "type":"date"
            }
        }
    }
}

вместо предоставления свойств "date" в нескольких местах, например:

{
    "personInfo":{
        "type":"object",
        "properties":{
            "name":{
                "type":"string"
            },
            "dateOfBirth":{
                "type":"object",
                "properties":{
                    "month":{
                        "type":"integer",
                        "minimum":1,
                        "maximum":12
                    },
                    "year":{
                        "type":"integer",
                        "minimum":0
                    }
                }
            }
        }
    },
    "student":{
        "type":"object",
        "properties":{
            "id":{
                "type":"personInfo"
            },
            "pass_out_year":{
                "type":"object",
                "properties":{
                    "month":{
                        "type":"integer",
                        "minimum":1,
                        "maximum":12
                    },
                    "year":{
                        "type":"integer",
                        "minimum":0
                    }
                }
            }
        }
    }
}

в соответствии с типом 5.1 в спецификации , это невозможно, но кажется, что это такой простой вариант использования!

Ответы [ 4 ]

4 голосов
/ 17 сентября 2013
  1. Как вы правильно поняли, $schema можно использовать для указания схемы, которой он соответствует.
  2. Я действительно нашел эту тему, пока гуглял для управления версиями схемы JSON, и идея использованияURI для управления версиями звучит логично.
  3. Вы можете использовать $ref для ссылки на другую схему, которая затем извлекается.
  4. Снова, вы можете использовать $ref и JSON Pointer для импорта определений из других схем.

Вы всегда можете проверить все путем проверки вашей схемы на наличие ошибок.

3 голосов
/ 23 мая 2014

На момент написания этой статьи текущей версией спецификации схемы JSON является draft-v4 , в которой формат date-time для string экземпляров четко указан и очень полезен на практике.

Более простого формата date, определенного до сих пор, не существует, но вы можете легко определить свойство вашего объекта как тип string, а затем применить проверку шаблона format (диалект регулярных выражений ECMA 262) поверх него.

Например:

{
    "$schema": "http://json-schema.org/draft-04/schema",
    "title": "Example Schema"
    "description": "This schema contains only a birth date property"
    "type": "object",
    "required": ["birth_date"],
    "properties": {
        "birth_date": {
            "type": "string",
            "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
        }
    }
}
2 голосов
/ 26 июля 2012

Почему бы вам просто не использовать "format" : "date" согласно # 5.23 в черновике схемы JSON 03 ?

Кроме того, ваше определение даты рождения не содержит дату, которая, по-видимомубыть ошибкой.

1 голос
/ 27 июня 2012

Спецификация предполагает, что вы могли бы:

Значения других типов МОГУТ использоваться для пользовательских целей, ...

Затем обсуждается, какие валидаторыминимальной реализации может сделать.

На мой взгляд, то, что вы хотите сделать, кажется, хорошо.Это может помочь вашей схеме яснее сохранить ссылку на тип и определение типа в одном файле.

Я думаю, что ваш файл, содержащий Q, должен обрабатываться вне json, например, иметь шаг dev, который генерирует полный json изскрипт / шаблон (например, erb или что-то подобное), объединяющий ваши подфайлы.На мой взгляд, ваш сервис должен всегда предоставлять полный JSON, необходимый для полного взаимодействия с этим сервисом.Если это становится неуправляемым с точки зрения клиентов, это может быть сигналом к ​​рефакторингу и внедрению другой службы.

...