JSON и типы данных в нем

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

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

Также, если уметь читать JSON, будет легко разобраться с разделом Пользователи и переменными в нем.

Конструктор опирается на JSON в своей работе с переменными, поэтому понимание JSON — важная часть понимания переменных в Ботмаме.

Простые типы данных

Строки записывают в прямых двойных «программистских» кавычках: "Привет мир".

Числа в записывают просто, без кавычек и чего-либо другого: 1.

Логические значения, также как и числа, записывают без кавычек и чего-либо другого: true или false.

NULL — т. е. ничего, записывают без кавычек в нижнем регистре: null.

Составные типы данных

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

Объект

Чтобы записать объект, открывают фигурную скобку {, после этого указывают ключ (имя вложенной в объект переменной) в виде строки, т. е. обязательно в прямых двойных кавычках. Потом ставят двоеточие, после чего записывают значение в любом доступном типе данных.

Если нужно добавить еще одно значение, ставят запятую и повторяют запись "ключ": значение. Когда все ключи и значения перечислили, объект закрывают фигурной скобкой }. Пробелы и переносы строк не учитываются, их можно расставлять на свое усмотрение.

Давайте попробуем написать пример, возьмем объект из раздела про Объекты и словари

{
   "name": "Валера",
   "role": "admin",
   "age": 18,
   "gender": "male",
   "isRoot": true
}

Так выглядит объект записанный в JSON.

name, role, gender — это строки, они в двойных кавычках.

age — это число, оно записано без кавычек и прочего.

isRoot — это логическая переменная в значении true.

После последней пары "ключ": значение запятая не ставится.

Тут можно узнать подробнее → про объекты и словари

Список

Списки записываются в квадратных скобках. Элементы списка отделяют запятыми.

После последнего элемента в списке запятая не ставится.

Список имен, который мы составляли раньше записывается в JSON вот так:

["Петя", "Наташа", "Маша", "Сережа"]

Не обязательно, чтобы все элементы списка были одного типа, список может состоять и из разных типов данных:

["Петя", 123, false, null]

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

Вложенный объект

Объекты можно вкладывать друг в друга. Значением в объекте может быть что угодно, даже другой объект. Давайте дополним наш объект пользователя другим объектом с местом его жительства:

{
  "name": "Валера",
  "role": "admin",
  "age": 18,
  "home": {
    "country": "UK",
    "city": "Hogsmith",
    "street": "Yew Street",
    "building": "10",
    "zip": 100115
  }
}

Список в объекте

Списки также можно вкладывать в объекты:

{
  "name": "Валера",
  "age": 18,
  "children": ["Марина", "Женя"]
}

Объекты в списках

Это также разрешено:

{
  "name": "Валера",
  "age": 18,
  "children": [
    { "name": "Марина", "age": 3 },
    { "name": "Женя", "age": 5 }
  ]
}

Список в списке

И так тоже можно:

{
  "type": "rect",
  "coords": [[0, 0], [10, 10]]
}

Пустой объект

Объект может вообще не содержать никаких вложенных переменных. Такой объект называют пустым. Записывается он просто открывающей и тут же закрывающей фигурными скобками: {}.

Пустой список

Список может вообще не содержать никаких данных. Такой список называют пустым. Записывается он просто открывающей и тут же закрывающей квадратными скобками: [].

Допустимый и недопустимый JSON

Допустимый JSON — это такой JSON, в котором не нарушены правила записи всех его составных частей.

Все строки взяты в двойные кавычки. Ключи объектов — это строки. В объектах и списках после последнего элемента не стоит запятая, числа записаны без пробелов, не используются недопустимые в JSON типы данных. Все объекты правильно открыты { и закрыты }, т. е. соблюден баланс скобочек. Это же касается и списков.

Обычно на «верхнем уровне» всегда находится объект или список. Чаще, все же, объект.

Просто записать любое другое допустимое значение JSON не запрещено, просто вы не сможете записать другие переменные.

Например, "Петя" — это валидный JSON, который состоит всего из одной строки.

Внутри значений в объектах и внутри элементов списка может быть любой другой валидный JSON. Но ключами объекта могут быть только строки.

Числа могут быть ключами объекта только в том случае, если они записаны как строки, т. е. в двойных кавычках. Собственно, они строками и будут:

{
  "1": "Ибрагим",
  "2": "Пенелопа"
}

Если полученной информации вам не хватило, можете ознакомиться со статьей на Википедии.

JSON и переменные в Ботмаме

Переменные пользователей можно посмотреть в разделе Пользователи. Если открыть карточку отдельного пользователя, все переменные записанные вами или созданные автоматически можно просмотреть в формате JSON. Полученные в этой статье знания могут помочь вам разобраться в этом.

Доступ к переменной из вложенного объекта

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

Например, у нас есть объект пользователя в переменных пользователя и мы хотим отправить в сообщении страну его домашнего адреса.

{
  "user": {
    "name": "Валера",
    "age": 18,
    "children": [
      { "name": "Марина", "age": 3 },
      { "name": "Женя", "age": 5 }
    ],
    "home": {
      "country": "UK",
      "city": "Hogsmith",
      "street": "Yew Street",
      "building": "10",
      "zip": 100115
    }
  }
}

Можем сделать это шаблоном: {{user.home.country}}. Каждый раз продвигаясь к более вложенному объекту мы ставим точку, пока не получим имя нужной нам вложенной переменной.

Со списками так тоже можно, только индекс нужного элемента из списка нужно указывать в квадратных скобках. Например, чтобы получить имя первого ребенка, мы можем воспользоваться таким шаблоном: {{user.children.[0].name}}. Обратите внимание на 0 элементы списков нумеруются с нуля, т. е. первый элемент списка находится по индексу 0.

Превращение переменой в JSON

Вы можете превратить почти любую переменную в Ботмаме в JSON. Для этого можно использовать хелпер stringify.

Этот хелпер удобен для формирования тела в компоненте Запрос или просто логирования переменных в чат во время отладки бота.

Использовать хелпер для формирования JSON очень просто: {{stringify user}}.

В начало ↑