Гайд Работа с JSON. Структура, использование в скриптах.

|DEVIL|

Известный
Автор темы
363
280
Не видел гайдов по JSON на форуме, и думаю, будет не лишним показать что этот JSON из себя представляет

Если вкратце: JSON - Это формат обмена данными, которые легко пишутся и читаются как и человеком, так и компьютером.

Структура JSON​


Каждый элемент JSON-таблицы состоит из ключа, и его значения. Для примера возьмём привычную нам таблицу LUA, но вместо привычных нумерований мы будем делать ключи:
Lua:
local t = {
    ['Member'] = 'Sweet', -- Мы указали ключ, и значение ключа (Member - ключ, Sweet - его значение)
    ['Number'] = 123, -- То же самое, только с целочисленным
    ['isGachi'] = true -- То же самое, только с логическим типом данных
}

print(t['Member'])

--Выведет Sweet, то же самое будет и с другими элементами, только тип данных будет другой

JSON-таблица имеет немного другую структуру, но почти аналогична:

JSON:
{
    "Member" : "Sweet",
    "Number" : 123,
    "isGachi" : true
}

Помимо этого, как и в LUA, мы можем добавить какой-либо массив, или объект:

JSON:
{
    "gachiNames" : [
        "Nikita", "Andrew", "Pavel"
    ],
  
    "gachies" : {
        "Nikita" : "Volkov",
        "Andrew" : "Mason",
        "Pavel" : "Volya"
    }
}

Работа с таблицами​


В библиотеке moonloader есть функции encodeJson, и decodeJson, как раз таки с ними мы и будем работать.

Представим, что у нас есть файл table.json:
JSON:
{
    "players" : {
        "Michael_Jordan" : "Bulls",
        "Edward_Bill" : "Defenders",
        "Katrin_White" : "Poop"
    }
}

Нам нужно проверить, в какой семье состоит Майкл Джордан (Семьи указаны в значениях ключей). Сделаем мы это так:
Lua:
local file = io.open("table.json", "r") -- Открываем файл в режиме чтения
a = file:read("*a") -- Читаем файл, там у нас таблица
file:close() -- Закрываем

table = decodeJson(a) -- Читаем нашу JSON-Таблицу

print(table["players"]["Michael_Jordan"]) -- Выведет Bulls

А теперь представим, что мы хотим сохранить новое значение, сделать это тоже просто:
Lua:
local file = io.open("table.json", r) -- Выполняем те же действия
a = file:read("*a")
file:close()

local table = decodeJson(a)

-- А теперь добавляем в таблицу значение

table["players"]["Marcus_Devil"] = "GachiFamily"

encodedTable = encodeJson(table) -- превращаем наш Lua массив в JSON

-- После того, как добавили, открываем файл в режиме записи

local file = io.open("table.json", "w")
file:write(encodedTable) -- Записываем нашу таблицу
file:flush() -- Сохраняем
file:close() -- Закрываем

Пример​


Где же можно использовать JSON-Таблицы? Как минимум это будет полезно при запросах в интернет.

К примеру, сделаем оповещения об обновлениях, таблица на сайте pastebin (RAW-формат) выглядит вот так:

JSON:
{
    "update" : 1.3,
    "news" : "Были добавлены оповещения об обновлениях."
}

Теперь делаем скрипт, который будет показывать диалог с оповещением, в случае если версия скрипта будет меньше новой версии:
Lua:
local version = 1.2 -- Указываем версию нашего скрипта

--Подключаем все нужные нам библиотеки
require 'moonloader'
local requests = require 'requests'
local encoding = require 'encoding'
encoding.default = "CP1251"
local u8 = encoding.UTF8

url = requests.get("https://pastebin.com/raw/UMEWVTJV") -- Отправляем GET запрос к нашей таблице

a = decodeJson(url.text) -- Получаем её, декодируем

function main()
    while not isSampAvailable() do wait(0) end
    -- Далее делаем условие, если наша версия меньше, показываем диалог
    if tonumber(a["update"]) > version then
        sampShowDialog(1234, "Обновление "..a["update"], "Обнаружено обновление "..a["update"].."!\n"..u8:decode(a["news"]), "Понял")
    end
    wait(0)
end

И получаем вот такой результат:

1627924094162.png


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

Надеюсь кому-то это будет полезно.
 
Последнее редактирование:

meowprd

Тот самый Котовский
Проверенный
1,278
718
гайды на json, дааааа, пиздец.
Для примера возьмём привычную нам таблицу LUA, но вместо привычных нумерований мы будем делать ключи:
это называется ассоциативный массив и почему ты использовал только его, когда можно использовать обычные двумерные массивы?
 
  • Нравится
Реакции: qdIbp и |DEVIL|

|DEVIL|

Известный
Автор темы
363
280
гайды на json, дааааа, пиздец.

это называется ассоциативный массив и почему ты использовал только его, когда можно использовать обычные двумерные массивы?
А что такого в гайде на JSON? Это же не гайд на переменные, или что-то в духе "Как открыть атом". Ну а двумерный массив уже я показал если не ошибаюсь во втором примере:
JSON:
"gachiNames" : [
        "Nikita", "Andrew", "Pavel"
    ]
Я немножко дебил, так что если это не двумерный массив, то скинь пример
 
  • Нравится
Реакции: meowprd

meowprd

Тот самый Котовский
Проверенный
1,278
718
А что такого в гайде на JSON? Это же не гайд на переменные, или что-то в духе "Как открыть атом". Ну а двумерный массив уже я показал если не ошибаюсь во втором примере:
JSON:
"gachiNames" : [
        "Nikita", "Andrew", "Pavel"
    ]
Я немножко дебил, так что если это не двумерный массив, то скинь пример
Ну технически двумерный, но прост тема не особо раскрыта
 

w99zzl1

Участник
77
7
а как сохранить настройки скриипта? Например в имгуи окне я выставил галочку (вкл), и хочу чтобы при перезагрузки скрипта эта галочка сохранилась
 

ChаtGPT

Активный
364
88
а как сохранить настройки скриипта? Например в имгуи окне я выставил галочку (вкл), и хочу чтобы при перезагрузки скрипта эта галочка сохранилась
Lua:
local inicfg = require('inicfg')

local ini = inicfg.load({
    config = {
        enabled = false
    }
}, 'config.ini') inicfg.save(ini, "config.ini")

local checkbox = new.bool(ini.config.enabled)

if imgui.CheckBox('checkbox', checkbox) then -- если нажали на чекбокс
    ini.config.enabled = checkbox[0] -- перезаписываем конфиг
    inicfg.save(ini, "config.ini") -- сохраняем конфиг
end

ой я перепутал с inicfg :D
Но чтобы сохранять подобные настройки, лучше всего использовать конфиг