Вопрос по массиву

Shishkin

Известный
Автор темы
537
273
Версия MoonLoader
.027.0-preview
Каким образом лучше всего сохранять массив? ini or json?
Если с помощью json - киньте хороший гайд с масивами
 
Решение
Lua:
function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")
        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end

-- Пример
local file = getWorkingDirectory()..'\\config\\SpisokLoshpedov.json' -- путь к файлу
local list = {} -- тут будет хранится прочитанный массив в виде таблицы

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end -- если нет файла, то создаем его
    list =...

chapo

tg/inst: @moujeek
Всефорумный модератор
9,090
12,118
Lua:
function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")
        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end

-- Пример
local file = getWorkingDirectory()..'\\config\\SpisokLoshpedov.json' -- путь к файлу
local list = {} -- тут будет хранится прочитанный массив в виде таблицы

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end -- если нет файла, то создаем его
    list = json(file):read() -- получаем массив из файла file

    sampRegisterChatCommand('jsonwrite', function(arg)
        if arg:find('(.+) (.+)') then
            local key, value = arg:match('(.+) (.+)')
            list[key] = value
            json(file):save()
        end
    end)
    wait(-1)
end

--[[
    Получить массив из файла: json(путь_к_файлу):read()
    Сохранить массив в файл: массив = json(путь_к_файлу):write()
]]
 
  • Нравится
Реакции: kyrtion, Rice. и Shishkin

kyrtion

Известный
1,167
426
Lua:
function json(filePath)
    local f = {}

    function f:read()
        local f = io.open(filePath, "r+")
        local jsonInString = f:read("*a")
        f:close()
        local jsonTable = decodeJson(jsonInString)
        return jsonTable
    end

    function f:write(t)
        f = io.open(filePath, "w")
        f:write(encodeJson(t))
        f:flush()
        f:close()
    end

    return f
end

-- Пример
local file = getWorkingDirectory()..'\\config\\SpisokLoshpedov.json' -- путь к файлу
local list = {} -- тут будет хранится прочитанный массив в виде таблицы

function main()
    while not isSampAvailable() do wait(0) end
    if not doesFileExist(file) then json(file):write({}) end -- если нет файла, то создаем его
    list = json(file):read() -- получаем массив из файла file

    sampRegisterChatCommand('jsonwrite', function(arg)
        if arg:find('(.+) (.+)') then
            local key, value = arg:match('(.+) (.+)')
            list[key] = value
            json(file):save()
        end
    end)
    wait(-1)
end

--[[
    Получить массив из файла: json(путь_к_файлу):read()
    Сохранить массив в файл: массив = json(путь_к_файлу):write()
]]
Лучше подниму чем создать новую тему...

Такс... После кмд [/jsonwrite one two] выдала ошибка о том что в save() нет значение, то есть, nil
а также после кмд и в джон содержится только это: {}
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,090
12,118
Лучше подниму чем создать новую тему...

Такс... После кмд [/jsonwrite one two] выдала ошибка о том что в save() нет значение, то есть, nil
а также после кмд и в джон содержится только это: {}
 
  • Нравится
Реакции: kyrtion

kyrtion

Известный
1,167
426
Окей… Похоже, что у меня нет библиотеки. Но когда решил проверить и выставил весь код и Ctrl + R
console in sampfuncs:
[ML] (error) test.lua: C:\Games\mhrp\bin\SAMP\moonloader\test.lua:38: module 'jCfg' not found:
    no field package.preload['jCfg']
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\libstd\jCfg.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\libstd\jCfg\init.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg.luac'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg\init.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg\init.luac'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\libstd\jCfg.dll'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg.dll'
stack traceback:
    [C]: in function 'require'
    C:\Games\mhrp\bin\SAMP\moonloader\test.lua:38: in main chunk
[ML] (error) test.lua: Script died due to an error. (id:4)
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,090
12,118
Окей… Похоже, что у меня нет библиотеки. Но когда решил проверить и выставил весь код и Ctrl + R
console in sampfuncs:
[ML] (error) test.lua: C:\Games\mhrp\bin\SAMP\moonloader\test.lua:38: module 'jCfg' not found:
    no field package.preload['jCfg']
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\libstd\jCfg.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\libstd\jCfg\init.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg.luac'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg\init.lua'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg\init.luac'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\libstd\jCfg.dll'
    no file 'C:\Games\mhrp\bin\SAMP\moonloader\lib\jCfg.dll'
stack traceback:
    [C]: in function 'require'
    C:\Games\mhrp\bin\SAMP\moonloader\test.lua:38: in main chunk
[ML] (error) test.lua: Script died due to an error. (id:4)
удали строку require('jCfg')
изначально хотел сделать в виде библиотеки
 

kyrtion

Известный
1,167
426
удали строку require('jCfg')
изначально хотел сделать в виде библиотеки
И снова
console sampfuncs:
[ML] (error) test.lua: json parse: Missing a name for object member. (at 1)
stack traceback:
    [C]: in function 'decodeJson'
    C:\Games\mhrp\bin\SAMP\moonloader\test.lua:25: in function 'Load'
    C:\Games\mhrp\bin\SAMP\moonloader\test.lua:40: in main chunk
[ML] (error) test.lua: Script died due to an error. (id:4)
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,090
12,118
И снова
console sampfuncs:
[ML] (error) test.lua: json parse: Missing a name for object member. (at 1)
stack traceback:
    [C]: in function 'decodeJson'
    C:\Games\mhrp\bin\SAMP\moonloader\test.lua:25: in function 'Load'
    C:\Games\mhrp\bin\SAMP\moonloader\test.lua:40: in main chunk
[ML] (error) test.lua: Script died due to an error. (id:4)
кинь код
 

kyrtion

Известный
1,167
426
Код:
function json(filePath)
    local filePath = getWorkingDirectory()..'\\config\\'..(filePath:find('(.+).json') and filePath or filePath..'.json')
    local class = {}
    if not doesDirectoryExist(getWorkingDirectory()..'\\config') then
        createDirectory(getWorkingDirectory()..'\\config')
    end
    
    function class:Save(tbl)
        if tbl then
            local F = io.open(filePath, 'w')
            F:write(encodeJson(tbl) or {})
            F:close()
            return true, 'ok'
        end
        return false, 'table = nil'
    end

    function class:Load(defaultTable)
        if not doesFileExist(filePath) then
            class:Save(defaultTable or {})
        end
        local F = io.open(filePath, 'r+')
        local TABLE = decodeJson(F:read() or {})
        F:close()
        for def_k, def_v in next, defaultTable do
            if TABLE[def_k] == nil then
                TABLE[def_k] = def_v
            end
        end
        return TABLE
    end

    return class
end

--require('jCfg')

local settings = json('cfg123.json'):Load({
    ['text'] = 'hello world',
    ['number'] = 550,
    ['state'] = true
})

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('json.print', function()
        for k, v in next, settings do
            sampAddChatMessage(k..' = '..tostring(v), -1)
        end
    end)
    sampRegisterChatCommand('json.append', function(arg)
        if arg:match('(.+) = (.+)') then
            local k, v = arg:match('(.+) = (.+)')
            settings[k] = v
            json('cfg123.json'):Save(settings)
            sampAddChatMessage('ok!', -1)
        else
            sampAddChatMessage('incorrect arg', -1)
        end
    end)
    wait(-1)
end

Я скопировал твой на другой теме, убрал библиотеке, как и сказал. Теперь что-то не так

Кстати, записывает не как и было...
1656184245375.png


Если снова перезагружать, выдает ошибку из-за того что json уже существует

Лучше подниму чем создать новую тему...

Такс... После кмд [/jsonwrite one two] выдала ошибка о том что в save() нет значение, то есть, nil
а также после кмд и в джон содержится только это: {}
проблема решена, нужно поменять :save() на :write(list)
 
Последнее редактирование: