json nil value

schtolz

Известный
Автор темы
113
66
Версия MoonLoader
.026-beta
JSON содержит следующую информацию
JSON:
{
"10423":{"log":{},"salary":-4000},
"310323":{"log":{}},
"settings":{"fontsize":20,"x":86,"y":587,"banking":false,"stats":true}
}
В этот JSON добавляю таким образом данные
Lua:
    table.insert(j[dateDay].log,{
        time = os.time() or 0,
        editMoney = diff or 0,
        eventsMoney = events or ""   
    })
Ошибка nil value начиная со строки table.insert. В чем дело? dateDay = 10423
 
Решение
Дело в том, что я пытаюсь это значение привести в строку, но ничего не выходит
Lua:
local dateDay = tostring(formatDate(os.date("%d")))
И так тоже оно выходит в nil
Lua:
local dateDay = tonumber(formatDate(os.date("%d")))
До этого эта функция formatDate отлично срабатывала и хорошо формирует дату:
Lua:
function formatDate(arg)
 
    local day = arg
    local month = tonumber(os.date("%m"))
    local year = tonumber(os.date("%y"))
    if day == 0 then
        month = tonumber(os.date("%m")) - 1
        if month == 0 then
            year = tonumber(os.date("%y")) - 1
            month = 12
        end
        if month == 01 or month == 03 or month == 05 or month == 07 or month == 08 or month == 10 or month == 12 then
            day...

Jertshat

Участник
28
41
ошибка возникает потому, что в таблице j нет ключа, соответствующего значению переменной dateDay, то есть j[dateDay] равно nil.

это происходит потому, что ты пытаешься получить доступ к ключу "10423" в таблице j, используя переменную dateDay, которая также равна "10423". однако в JSON-объекте, который ты привел, ключ "10423" не является строкой, а числом, поэтому следует использовать число в качестве ключа при добавлении элементов в таблицу.

исправленный код:

Lua:
local dateDay = 10423
if not j[dateDay] then
    j[dateDay] = { log = {}, salary = 0 }
end

table.insert(j[dateDay].log,{
    time = os.time() or 0,
    editMoney = diff or 0,
    eventsMoney = events or "" 
})


добавлена проверка на существование ключа dateDay в таблице j. если этот ключ не существует, создаем новую таблицу для этого ключа, содержащую пустой массив log и значение salary по умолчанию равное 0. затем можем добавлять новые элементы в массив log для ключа dateDay.
 

schtolz

Известный
Автор темы
113
66
ошибка возникает потому, что в таблице j нет ключа, соответствующего значению переменной dateDay, то есть j[dateDay] равно nil.

это происходит потому, что ты пытаешься получить доступ к ключу "10423" в таблице j, используя переменную dateDay, которая также равна "10423". однако в JSON-объекте, который ты привел, ключ "10423" не является строкой, а числом, поэтому следует использовать число в качестве ключа при добавлении элементов в таблицу.

исправленный код:

Lua:
local dateDay = 10423
if not j[dateDay] then
    j[dateDay] = { log = {}, salary = 0 }
end

table.insert(j[dateDay].log,{
    time = os.time() or 0,
    editMoney = diff or 0,
    eventsMoney = events or ""
})


добавлена проверка на существование ключа dateDay в таблице j. если этот ключ не существует, создаем новую таблицу для этого ключа, содержащую пустой массив log и значение salary по умолчанию равное 0. затем можем добавлять новые элементы в массив log для ключа dateDay.
Дело в том, что я пытаюсь это значение привести в строку, но ничего не выходит
Lua:
local dateDay = tostring(formatDate(os.date("%d")))
И так тоже оно выходит в nil
Lua:
local dateDay = tonumber(formatDate(os.date("%d")))
До этого эта функция formatDate отлично срабатывала и хорошо формирует дату:
Lua:
function formatDate(arg)
   
    local day = arg
    local month = tonumber(os.date("%m"))
    local year = tonumber(os.date("%y"))
    if day == 0 then
        month = tonumber(os.date("%m")) - 1
        if month == 0 then
            year = tonumber(os.date("%y")) - 1
            month = 12
        end
        if month == 01 or month == 03 or month == 05 or month == 07 or month == 08 or month == 10 or month == 12 then
            day = 31
            elseif month == 02 then
            day = 28
            elseif month == 04 or month == 06 or month == 09 or month == 11 then
            day = 30
        end
       
        oldDate = day .. month .. year
    end
    oldDate = day .. (month <= 9 and "0"..month or month) .. year
    return tostring(oldDate)
end
Я добавил твою функцию проверки
Lua:
if not j[dateDay] then
    j[dateDay] = { log = {}, salary = 0 }
end
Теперь он ругается на первую строку в твоей функции, при этом JSON файл остается быть в таком значении:
JSON:
{
    "10423":{"payday":2,"salary":74000,"log":{},"deposit":864497.634,"orgsalary":0},
    "310323":{"log":{}},
    "settings":{"fontsize":20,"x":86,"y":587,"banking":false,"stats":true}
}
 

Jertshat

Участник
28
41
Дело в том, что я пытаюсь это значение привести в строку, но ничего не выходит
Lua:
local dateDay = tostring(formatDate(os.date("%d")))
И так тоже оно выходит в nil
Lua:
local dateDay = tonumber(formatDate(os.date("%d")))
До этого эта функция formatDate отлично срабатывала и хорошо формирует дату:
Lua:
function formatDate(arg)
 
    local day = arg
    local month = tonumber(os.date("%m"))
    local year = tonumber(os.date("%y"))
    if day == 0 then
        month = tonumber(os.date("%m")) - 1
        if month == 0 then
            year = tonumber(os.date("%y")) - 1
            month = 12
        end
        if month == 01 or month == 03 or month == 05 or month == 07 or month == 08 or month == 10 or month == 12 then
            day = 31
            elseif month == 02 then
            day = 28
            elseif month == 04 or month == 06 or month == 09 or month == 11 then
            day = 30
        end
   
        oldDate = day .. month .. year
    end
    oldDate = day .. (month <= 9 and "0"..month or month) .. year
    return tostring(oldDate)
end
Я добавил твою функцию проверки
Lua:
if not j[dateDay] then
    j[dateDay] = { log = {}, salary = 0 }
end
Теперь он ругается на первую строку в твоей функции, при этом JSON файл остается быть в таком значении:
JSON:
{
    "10423":{"payday":2,"salary":74000,"log":{},"deposit":864497.634,"orgsalary":0},
    "310323":{"log":{}},
    "settings":{"fontsize":20,"x":86,"y":587,"banking":false,"stats":true}
}
судя по описанию проблемы, скорее всего, в переменной dateDay получается значение nil, поэтому код не может получить доступ к нужному ключу в таблице j.

в функции formatDate есть одна ветка if day == 0 then, которая может вернуть nil, если значение day окажется равным 0. скорее всего, именно это и происходит в твоем случае.

чтобы исправить проблему, нужно добавить дополнительную проверку на nil после вызова функции formatDate, чтобы убедиться, что значение dateDay не равно nil. например, можешь изменить код следующим образом:


Lua:
local dateDay = formatDate(os.date("%d"))
if dateDay then
  if not j[dateDay] then
    j[dateDay] = { log = {}, salary = 0 }
  end

  table.insert(j[dateDay].log,{
    time = os.time() or 0,
    editMoney = diff or 0,
    eventsMoney = events or ""
  })
else
  print("Ошибка: значение dateDay равно nil")
end


добавляем проверку на nil после вызова функции formatDate, и если значение dateDay равно nil, то выводим сообщение об ошибке. Если значение dateDay не равно nil, продолжаем выполнение кода, добавляя новые элементы в массив log для ключа dateDay.

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