1

我有以下代码:

PerformHttpRequest('http://ossie.dk/API/verify.json',function(err, text, headers)
    local r=json.decode(text)
    for s,t in pairs(r.servers)do
         print(t)
    end
end,"GET","",{})
               

我的问题是,在从 verify.json 解码内容时,我不断收到此错误:bad argument #1 to 'strfind' (string expected, got nil) 或者试图做一个键的值不是表. 在这一点上我真的很迷茫,花了这么多时间在这件事上。我认为整个问题在于 JSON 是如何设置的。它需要是一个字符串,但也是一个表,我可以稍后将其用于我的键、值对,以便我可以从中获取所有信息。我希望这有某种意义。

脚本错误来自这里:

local function scanwhite (str, pos)
  while true do
    pos = strfind (str, "%S", pos)
    if not pos then return nil end
    local sub2 = strsub (str, pos, pos + 1)
    if sub2 == "\239\187" and strsub (str, pos + 2, pos + 2) == "\191" then
      -- UTF-8 Byte Order Mark
      pos = pos + 3
    elseif sub2 == "//" then
      pos = strfind (str, "[\n\r]", pos + 2)
      if not pos then return nil end
    elseif sub2 == "/*" then
      pos = strfind (str, "*/", pos + 2)
      if not pos then return nil end
      pos = pos + 2
    else
      return pos
    end
  end
end

我当前的 JSON 如下所示:

{   
    { "servers": 
        "ip": 
        [
            "144",
            "155",
            "166"
        ]
    }
}

顺便说一句,我试过改变

r.servers

r.ip

然后它给出:无效向量场:ip

如果我只是这样做

for k,v in pairs(r) do

它会给我这个错误:

Table expected, got string

我使用的是 FiveM 的 JSON 库。

如果您有任何问题或不明白我的意思,请随时在评论中提问。

4

2 回答 2

0

第一个 JSON 有一点问题。您使用的对象没有向 JSON 声明您将使用它。尝试这个

{   
    { "servers":
        { 
            "ip": [
                "144",
                "155",
                "166"
            ]
        }
    }
}
于 2021-04-14T11:02:45.800 回答
0

你打错了你的 str:find() 和 str:sub() 命令。

local function scanwhite( str,  pos )
  while true do
    pos = str :find( "%S",  pos )
    if not pos then return nil end
    local sub1 = str :sub( pos,  pos +1 )
    local sub2 = str :sub( pos +2,  pos +2 )
    if sub1 == "\239\187" and sub2 == "\191" then
      -- UTF-8 Byte Order Mark
      pos = pos +3
    elseif sub1 == "//" then
      pos = str :find( "[\n\r]",  pos +2 )
      if not pos then return nil end
    elseif sub1 == "/*" then
      pos = str :find( "*/",  pos +2 )
      if not pos then return nil end
      pos = pos +2
    else
      return pos
    end
  end
end
于 2020-10-27T02:52:09.567 回答