Синтаксис для документування структури JSON


77

Отже, я намагаюся задокументувати формат json, який повертається api, проти якого я пишу, і я хотів би знати, чи існує якийсь популярний формат для документації структури json.

Примітка. Я не намагаюсь нічого перевірити чи перевірити, я просто використовую це для документації. Також було б непогано додати деякі способи додавання коментарів до неконстантних (елементи завжди повертаються з однаковим значенням).

Це не зовсім продумана схема, яку я зараз використовую:

Plain names refer to identifiers or types.
Some types have type-comment
Strings that appear to be constant(always returned for that type of request) strings are "str"
Constant Numbers would be just the number
Constant null is null
Booleans are true/false for constant booleans or Boolean otherwise
[a,b,c] are lists with 3 items a,b,c
[...  ...] is a list of repeating elements of some types/constants/patterns
{a:A,b:B,c:c} and {... ...}  is the same for a dictionary.

приклад:

story          := [header,footer]
header         := {"data":realHeader,"kind":"Listing"}
realHeader     := {"after": null, "before": null, "children": [{"data": realRealHeader, "kind": "t3"}], "modhash": ""}
footer         := {"data":AlmostComments,"kind":"Listing"}
AlmostComments := {"data": {"after": null, "before": null, "children": comments, "modhash": ""}, "kind": "t1"}
comments       := [...{"data":comment, "kind":"t1"}...]

realRealHeader :=
{"author": string,
"clicked": boolean,
"created": int,
"created_utc": int,
"domain": "code.reddit.com",
"downs": int,
"hidden": boolean,
"id": string-id,
"is_self": boolean,
"levenshtein": null,
"likes": null,
"media": null,
"media_embed": { },
"name": string-id,
"num_comments": int,
"over_18": false,
"permalink": string-urlLinkToStoryStartingFrom/r,
"saved": false,
"score": int,
"selftext": string,
"selftext_html": string-html,
"subreddit": string-subredditname,
"subreddit_id": string-id,
"thumbnail": "",
"title": string,
"ups": int,
"url": "http://code.reddit.com/"
}


comments := {
"author": string,
"body": string-body_html-wout-html,
"body_html": string-html-formated,
"created": int,
"created_utc": int,
"downs": int,
"id": string-id,
"levenshtein": null,
"likes": null,
"link_id": string-id,
"name": string-id",
"parent_id": string-id,
"replies": AlmostComments or null,
"subreddit": string-subredditname,
"subreddit_id": string-id,
"ups": int
}

2
Я думаю, що ваша схема насправді є досить хорошою відправною точкою. Я збирався запропонувати для полів, які мають обмежені значення, використовувати такий синтаксис "mode": "fast" | "medium" | "slow",, де кожне можливе значення явно вказано як літеральний рядок або int або boolean. Вертикальний стовпчик |не є законним у JSON (поза рядком), тому розуміється його значення як метасимволу.
Mark Lakata

поки світ не знайде "єдиного розміру для всіх", можна спробувати це jsondoc.online
Буван

Відповіді:


36

Теоретично схема JSON може слугувати цій меті, але на практиці я не впевнений, що це робить. Варто згадати, сподіваюся.

Окрім цього, моя особиста думка полягає в тому, що оскільки JSON переважно використовується для передачі об'єктів, документування еквівалентних об'єктів у використанні мовного клієнта (Java, C #, різні мови сценаріїв) може мати найбільший сенс - врешті-решт, такі об'єкти зазвичай відображаються / пов'язані до JSON і назад. І тоді ви можете використовувати будь-які доступні інструменти документації, такі як Javadoc для Java (perldoc для Perl, Oxygen для c ++ тощо).

Для зазначення інтерфейсів існує також WADL (Мова опису веб-програми), що може допомогти.


1
Старе питання, але - частина "гіпер-схеми" стандарту JSON Schema може цілком документувати посилання / форми.
cloudfeet

15

Як створити HTML-документацію з JSON:

Вам потрібно буде створити схему Json , є ця послуга, в яку ви можете вставити оригінальний JSON і автоматично створити схему:

http://www.jsonschema.net/

Маючи в руках схему, ви можете автоматично генерувати HTML-документацію за допомогою Matic.

https://github.com/mattyod/matic

Генерування HTML

Щоб встановити Matic, вам знадобиться встановити Node.js: http://nodejs.org/

У Windows запустіть CMD

Встановіть Jade за допомогою цієї команди: npm install -g jade

Відкрийте завантажену папку Matic із Github: cd PATH_TO_FOLDER/matic

Запустіть команду встановлення: npm install -g

Завантажте приклад проекту документації: https://github.com/mattyod/matic-simple-example

Помістіть свою схему в папку "схеми"

Відкрийте папку проекту: cd PATH_TO_PROJECT_FOLDER

Команда запуску: matic

Ви повинні побачити повідомлення про успіх: Documentation built to ./web/


1
Дякуємо за згадку про Matic. Тільки одну точку, ви також можете встановити його, запустивши: npm install -g matic
Mattyod

Я хотів би мати можливість перевірити JSON за допомогою схеми Json, чи можливо це, чи це корисно лише для створення документації?
Дарил

jsonschema.net більше не відповідає, можливо app.quicktype.io/#l=schema може бути корисним
lrkwz

Можливо, я помиляюся, але Matic не може обробляти масиви об'єктів?
Пітер,

З моменту розміщення цієї відповіді відбулись деякі зміни. Тепер потрібен Мопс, а не Джейд. Також тут див. Новий приклад Matic: github.com/mattyod/matic-draft4-example
Роберто

8

Я не впевнений, чому ви намагаєтеся задокументувати JSON, я думаю, ваша спроба знайти послідовний спосіб повідомити IDE або розробника про типи даних у вашому позначенні.

jsdoc (http://jsdoc.sourceforge.net/#usage) може бути тим, що ви шукаєте.

наприклад:

{
   /**
     * Name of author
     * @type String
     */
   "author": null, 
   /**
     * has the author been clicked
     * @type Boolean
     */
   "clicked": null, 
   /**
     * Unix Timestamp of the creation date
     * @type Int
     */
   "created": null
}

Як варіант, якщо ви намагаєтеся продемонструвати структуру ваших даних. Ви можете подивитися на YAML (http://www.yaml.org/), він розроблений як зручний для читання формат серіалізації, який, можливо, краще підходить для документування вашої структури даних.

Швидкий приклад:

Author:
  name: String
  clicked: Boolean
  created: Integer

12
Задокументувати API для розробників.
Роман А. Тайчер,

1
Форма виводу jsdoc - це саме те, що я б зробив, і я помістив би його безпосередньо у джерело служби, яка видає вихідні дані, у верхній частині файлу. Потім я б поставив короткий зразок виходу нижче цього. Домовленість полягає в тому, що розробники, яким потрібно скористатися послугою, просто переходять до джерела.
jaydel

3
Зверніть увагу, що коментарі заборонені в JSON. Вони зроблять API, наприклад JavaScript JSON.parse (), невдалими. Ви все ще можете включати коментарі, але їх доведеться видалити з JSON перед доставкою до місця призначення (програма для читання конфігурацій, веб-клієнт, ...)
Alexandre Morgaut

5

Для простих API, де кожен фрагмент JSON має лише один або два рівні, то документування на прикладах здається звичайною практикою.

Однак для більш складних моделей даних, таких як ваша, я не бачив жодного хорошого рішення. Є кілька пропозицій щодо схеми JSON, але це, здається, суперечить духу JSON і здається занадто важкою вагою для вашої мети просто документування.

Особисто я думаю, що ваша схема дуже хороша. З кількома невеликими розширеннями для обробки факультативних та альтернативних розділів, я думаю, це може бути настільки ж виразним, як Форма Бакуса-Наура, бути дуже простим для читання та розуміння та відповідати духу JSON. Можливо, ми можемо отримати певний імпульс для інших, щоб використати цю "Граматичну форму Taycher JSON" (TJGF)!


3

Ви можете написати зразок відповіді JSON, а потім задокументувати її за допомогою Markdown та Docco . Docco виводить документацію на основі HTML.


1
Однією із проблем у від’єднанні його від джерела, що споживає та виробляє JSON, є те, що ви додаєте новий ризик синхронізації двох речей. Звичайно, це загальна проблема з усією документацією, але оскільки аудиторія тут - розробники, залишення прикладу в коді, ймовірно, допомагає трохи зменшити цей ризик.
jaydel

3

Це може бути не корисно у вашому випадку, оскільки здається, ви не створюєте API.

Але якби це було так, і ви використовували Java або JVM (JAX-RS), ви могли б скористатися Swagger.

Це дозволяє описувати ваш API у вигляді JSON (наприклад, WSDL / WADL). І вони забезпечують рівень IHM, який читає таке представлення JSON вашого API. Ось що ви отримаєте: http://petstore.swagger.wordnik.com/

https://developers.helloreverb.com/swagger/


Всі посилання мертві.
jnovack

0

Простий, але ефективний спосіб - створити схему JSON за допомогою генератора схем JSON, а потім використовувати схему JSON для людей , утиліту Python для створення HTML-інтерактивної документації:

pip install json-schema-for-humans
generate-schema-doc [OPTIONS] SCHEMA_FILE [RESULT_FILE]

Корисні посилання:

  1. Сторінка pypi json-schema-for-people
  2. Документація json-schema-for-people, яка включає деякі наочні приклади результату

Майте на увазі, схема JSON на сьогодні все ще перебуває у стані проекту, з метою стати стандартом IETF у майбутньому.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.