Подтвердить что ты не робот

Как описать данные JSON в спецификации?

Каков наилучший способ описания данных JSON в спецификации?

В прошлом я использовал примеры с "многословными" описаниями, но он чувствует себя неточно.

Кажется, существует стандартная схема JSON, но она не выглядит как очень активный проект. Любые другие способы?


(Обновить). Подумав об этом несколько дней, мне нравится предложение bmargulies, использующее соглашение об конверсии. Поскольку документы JSON в этом случае выходят из .NET-сервисов .NET, я собираюсь просто документировать схему с синтаксисом класса С#. Это может быть не совсем жестким, но все участники понимают это и в сочетании с примерами получат сообщение как можно быстрее.

4b9b3361

Ответ 1

Я бы порекомендовал мою библиотеку JavaScript js-schema. Первичная мотивация позади этого была той же, что вы описали в вопросе. Это простая и понятная нотация для описания схем JSON (или спецификации, если вы хотите).

Пример схемы, описанной в схеме JSON:

{
  "type":"object",
  "properties":{
    "id":{
      "type":"number",
      "required":true
    },
    "name":{
      "type":"string",
      "required":true
    },
    "price":{
      "type": "number",
      "minimum":0,
      "required":true
    },
    "tags":{
      "type":"array",
      "items":{
        "type":"string"
      }
    }
  }
}

и то же описание схемы с js-схемой:

{
  "id"    : Number,
  "name"  : String,
  "price" : Number.min(0),
  "?tags" : Array.of(String)
}

Библиотека может проверять объект против схем, генерировать случайные объекты, соответствующие данной схеме, и сериализовать/десериализовать в/из схемы JSON.

Ответ 2

Я знаю, что это более старый вопрос, но он может быть полезен кому-то еще: При поиске методов для описания JSON-данных я наткнулся на Orderly. Здесь абстрактное право на первой странице:

Заказ - текстовый формат для описания JSON. Заказ можно скомпилировать в JSONSchema. Он предназначен для легкого чтения и записи.

Я могу согласиться с этим, но я только пробовал его с относительно простыми структурами до сих пор.

Ответ 3

Как насчет использования какого-то расширенного BNF?

PERSON <- { "firstname": FIRSTNAMES, "lastname": LASTNAME, "age": AGE, "version": VERSION, "parents" <- PARENTS }

FIRSTNAMES <- [ FIRSTNAME+ ]

FIRSTNAME <- STRING

LASTNAME <- STRING

PARENTS <- [ PERSON{0,2} ]

AGE <- INTEGER

VERSION <- 1 | 2

Вам нужно было бы определить значение описания типа атома типа INTEGER и STRING. Если вы хотите добавить нестрочные ключи для словарей, вы должны определить следующее:

BREADLOOKUP <- { (TYPE : HOWMANY)+ }

TYPE <- "white" | "dark" | "french" | "croissant"

HOWMANY <- POSITIVE-INTEGER

Это позволит использовать такие вещи, как

{ "white": 5, 
  "french": 2
}

Поскольку как регулярные выражения, так и BNF хорошо известны, это может быть простым способом идти. ?, +, *, {n}, {min,max} будут легкими способами указать количество элементов (взятых из регулярных выражений), а остальное - довольно чистый BNF.

Если вы делаете это достаточно строго, это может даже быть понятным для валидатора.

Ответ 4

Вы можете комбинировать XML-схему W3C или некоторую менее уродливую схему, например RelaxNG, с соглашениями об конверсиях.