Перейти к содержимому

Конвертировать данные JSON в схему GraphQL — Numio

Генерирует объектные типы GraphQL SDL по образцу JSON. Корень становится AutogeneratedMainType, каждый вложенный объект или массив объектов — именованным типом, а все элементы массива объединяются в один тип.

Набросок типов для GraphQL-обёртки над существующим REST-эндпоинтом по одному из его ответов.

JSON

GraphQL

Когда пригодится

  • Набросок типов для GraphQL-обёртки над существующим REST-эндпоинтом по одному из его ответов.
  • Получение стартовой схемы для mock-сервера или schema-first прототипа по образцу данных.

Как пользоваться

  1. Вставьте JSON-объект или массив объектов, которые объединяются в один корневой тип, в левый редактор или откройте файл в кодировке UTF-8 кнопкой загрузки файла.
  2. Проверьте сгенерированные типы: имена берутся из ключей (posts становится Posts), а скаляры отображаются в String, Int, Float или Boolean.
  3. Скопируйте SDL, затем добавьте ! для обязательных полей, замените тип полей id на ID и переименуйте AutogeneratedMainType.

JSON-объект

{
  "id": "u_1",
  "name": "Ada",
  "age": 36,
  "score": 9.5,
  "nickname": null,
  "tags": ["math"],
  "address": { "city": "London" },
  "posts": [{ "id": 7, "title": "Notes" }]
}

Схема GraphQL (SDL)

type AutogeneratedMainType {
  id: String
  name: String
  age: Int
  score: Float
  nickname: String
  tags: [String]
  address: Address
  posts: [Posts]
}

type Address {
  city: String
}

type Posts {
  id: Int
  title: String
}

Подробности и ограничения

Поля объединяются по всем элементам массива. null и пустые массивы становятся String и [String]; Int вместе с Float даёт Float, остальные конфликты сводятся к String.

Имена типов берутся из ключей (posts становится Posts). Если один и тот же ключ содержит объекты разной формы, более поздний получает имя по родителю (например, AB), а не перезаписывает прежний.

Не генерируются ! (non-null), ID, тип Query и input-типы. Целые числа за пределами 32-битного диапазона получают тип Float, так как Int в GraphQL 32-битный.

Работает в браузере, результат форматируется Prettier; для невалидного JSON показывается ошибка разбора.

FAQ

Можно ли преобразовать JSON-массив на верхнем уровне?

Да, если он содержит объекты: все элементы объединяются в AutogeneratedMainType, поэтому поля, встречающиеся лишь в некоторых элементах, тоже включаются. Корневой массив простых значений отклоняется, потому что у него нет полей.

Почему поле id получило тип String, а не ID?

Типы определяются только по значению в JSON: строковый id становится String, числовой — Int. Замените его на ID вручную.

Как типизируются значения null?

Как String, поскольку значение null не несёт типа. Замените его реальным образцом, если поле — число или объект.

Спецификации и справка