Конвертировать данные JSON в схему GraphQL — Numio
Генерирует объектные типы GraphQL SDL по образцу JSON. Корень становится AutogeneratedMainType, каждый вложенный объект или массив объектов — именованным типом, а все элементы массива объединяются в один тип.
Набросок типов для GraphQL-обёртки над существующим REST-эндпоинтом по одному из его ответов.
JSON
GraphQL
Когда пригодится
- Набросок типов для GraphQL-обёртки над существующим REST-эндпоинтом по одному из его ответов.
- Получение стартовой схемы для mock-сервера или schema-first прототипа по образцу данных.
Как пользоваться
- Вставьте JSON-объект или массив объектов, которые объединяются в один корневой тип, в левый редактор или откройте файл в кодировке UTF-8 кнопкой загрузки файла.
- Проверьте сгенерированные типы: имена берутся из ключей (posts становится Posts), а скаляры отображаются в String, Int, Float или Boolean.
- Скопируйте 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 не несёт типа. Замените его реальным образцом, если поле — число или объект.