Исходник Информация Красивый JSON

Smeruxa

Известный
Автор темы
1,361
722
JSON, в который после добавления нового элемента, не нужно удалять конфиг, работает как ini, только поддерживает непосекционное расположение
Как установить: Ctrl + C + Ctrl + V -> вверху вашего кода, подгружать и все делать так же, как с ini, только вместо inicfg мы пишем json

Сам JSON:

Lua:
local json = {}

json.save = function(array, nameFile)
    local file = io.open(getWorkingDirectory().."\\config\\"..nameFile, "w")
    file:write(encodeJson(array))
    file:close()
end

json.checkAdapt = function(defaultArray, nameFile)
    local file = io.open(getWorkingDirectory().."\\config\\"..nameFile, "r")
    if file then
        local currentConfig = decodeJson(file:read("*a"))
        file:close()

        local function recursiveCheck(default, current)
            for key, value in pairs(default) do
                if current[key] == nil then
                    current[key] = value
                elseif type(value) == "table" and type(current[key]) == "table" then
                    recursiveCheck(value, current[key])
                end
            end

            for key in pairs(current) do
                if default[key] == nil then
                    current[key] = nil
                end
            end
        end

        recursiveCheck(defaultArray, currentConfig)
        json.save(currentConfig, nameFile)
    else
        json.save(defaultArray, nameFile)
    end
end

json.load = function(defaultArray, nameFile)
    json.checkAdapt(defaultArray, nameFile)

    local file = io.open(getWorkingDirectory().."\\config\\"..nameFile, "r")
    if file then
        local luaTable = decodeJson(file:read("*a"))
        file:close()
        
        return luaTable
    else
        return defaultArray
    end
end

Пример использования:
Lua:
local cfg = json.load({
    main = {
        test = {
            lol = {
                jjk = {},
                l = 0
            }
        }
    },
    raje = {
        aim = false,
        wh = false,
        gm = {
            refactor = false,
            bullets = false,
            hp = false
        }
    }
}
json.save(cfg, "config.json")

Как работает?
При изменении таблицы в коде, если с таблицей в json не совпадает, то просто добавляет новые ключи и значения, либо же удаляет, конец
 

Smeruxa

Известный
Автор темы
1,361
722
Лично столкнулся с проблемой при создании массивов, изменяющихся при взаимодействии с пользователем
Для решения этой проблемы (удаления новых элементов) нужно изменить функцию
Lua:
json.checkAdapt = function(defaultArray, nameFile)
    local file = io.open(getWorkingDirectory().."\\config\\"..nameFile, "r")
    if file then
        local currentConfig = decodeJson(file:read("*a"))
        file:close()

        local function recursiveCheck(default, current)
            for key, value in pairs(default) do
                if current[key] == nil then
                    current[key] = value
                elseif type(value) == "table" and type(current[key]) == "table" then
                    recursiveCheck(value, current[key])
                end
            end
        end

        recursiveCheck(defaultArray, currentConfig)
        json.save(currentConfig, nameFile)
    else
        json.save(defaultArray, nameFile)
    end
end