简体   繁体   中英

String passed to JSON library turns into a table

When I execute this code (Windows 10) i get an error from within the library.

local json = loadfile("json.lua")()

local handle = io.popen("curl \"https://someurl.com\"")
local result = handle:read("*all")
handle:close()

local output = json:decode(result)

The error in the console:

lua: json.lua:377: expected argument of type string, got table
stack traceback:
        [C]: in function 'error'
        json.lua:377: in method 'decode'
        monitor.lua:10: in main chunk
        [C]: in ?

I'm running the code on Windows 10 with a console and using this library: https://github.com/rxi/json.lua

This function always returns the same error, even if I try different types of arguments, ie numbers or strings.

function json.decode(str)
  if type(str) ~= "string" then
    error("expected argument of type string, got " .. type(str))
  end
  local res, idx = parse(str, next_char(str, 1, space_chars, true))
  idx = next_char(str, idx, space_chars, true)
  if idx <= #str then
    decode_error(str, idx, "trailing garbage")
  end
  return res
end
local output = json:decode(result)

is syntactic sugar for

local output = json.decode(json, result)

json is a table.

Hence inside function json.decode the following if statement is entered:

if type(str) ~= "string" then
    error("expected argument of type string, got " .. type(str))
end

which produces the observed error.

To fix this you can either change the function definiton to

function json:decode(str)
  -- code
end

Or you call

local output = json.decode(result)

You should pick the second one as changing the json library will affect code that already uses json.decode as intended by the author.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM