computercraft json -- Original code written by ElvishJerricco ( http://www.computercraft.info/forums2/index.php?/topic/5854-json-api-v201-for-computercraft/ ) -- Code modified by DaikiKaminari for personnal purpose, transformed it to a library that can be loaded using the "require" function -- v2.0.5-DAIKI-1 ------------------------------------------------------------------ library local json = {} ------------------------------------------------------------------ utils local controls = {["\n"]="\\n", ["\r"]="\\r", ["\t"]="\\t", ["\b"]="\\b", ["\f"]="\\f", ["\""]="\\\"", ["\\"]="\\\\"} computercraft json How to get it? computercraft json local function isArray(t) local max = 0 for k,v in pairs(t) do if type(k) ~= "number" then return false elseif k > max then max = k end end return max == #t computercraft json How to get it for free? computercraft json end json.isArray = isArray local whites = {['\n']=true; ['\r']=true; ['\t']=true; [' ']=true; [',']=true; [':']=true} local function removeWhite(str) while whites[str:sub(1, 1)] do str = str:sub(2) end return str end computercraft json PasteShr computercraft json json.removeWhite = removeWhite ------------------------------------------------------------------ encoding local function encodeCommon(val, pretty, tabLevel, tTracking) local str = "" -- Tabbing util local function tab(s) str = str .. ("\t"):rep(tabLevel) .. s computercraft json How to use it? computercraft json end local function arrEncoding(val, bracket, closeBracket, iterator, loopFunc) str = str .. bracket if pretty then str = str .. "\n" tabLevel = tabLevel + 1 end for k,v in iterator(val) do tab("") computercraft json How to use it? computercraft json loopFunc(k,v) str = str .. "," if pretty then str = str .. "\n" end end if pretty then tabLevel = tabLevel - 1 end if str:sub(-2) == ",\n" then str = str:sub(1, -3) .. "\n" elseif str:sub(-1) == "," then computercraft json How to get it? computercraft json str = str:sub(1, -2) end tab(closeBracket) end -- Table encoding if type(val) == "table" then assert(not tTracking[val], "Cannot encode a table holding itself recursively") tTracking[val] = true if isArray(val) then computercraft json How to get it for free? computercraft json arrEncoding(val, "[", "]", ipairs, function(k,v) str = str .. encodeCommon(v, pretty, tabLevel, tTracking) end) else arrEncoding(val, "{", "}", pairs, function(k,v) assert(type(k) == "string", "JSON object keys must be strings", 2) str = str .. encodeCommon(k, pretty, tabLevel, tTracking) str = str .. (pretty and ": " or ":") .. encodeCommon(v, pretty, tabLevel, tTracking) end) end computercraft json How to use it? computercraft json -- String encoding elseif type(val) == "string" then str = '"' .. val:gsub("[%c\"\\]", controls) .. '"' -- Number encoding elseif type(val) == "number" or type(val) == "boolean" then str = tostring(val) else error("JSON only supports arrays, objects, numbers, booleans, and strings", 2) end return str computercraft json How to use it? computercraft json end json.encodeCommon = encodeCommon function encode(val) return encodeCommon(val, false, 0, {}) end json.encode = encode function encodePretty(val) return encodeCommon(val, true, 0, {}) computercraft json How to dowload it? computercraft json end json.encodePretty = encodePretty ------------------------------------------------------------------ decoding local decodeControls = {} for k,v in pairs(controls) do decodeControls[v] = k end computercraft json How to dowload it? computercraft json local function parseBoolean(str) if str:sub(1, 4) == "true" then return true, removeWhite(str:sub(5)) else return false, removeWhite(str:sub(6)) end end json.parseBoolean = parseBoolean local function parseNull(str) computercraft json How to dowload it? computercraft json return nil, removeWhite(str:sub(5)) end json.parseNull = parseNull local numChars = {['e']=true; ['E']=true; ['+']=true; ['-']=true; ['.']=true} local function parseNumber(str) local i = 1 while numChars[str:sub(i, i)] or tonumber(str:sub(i, i)) do i = i + 1 end computercraft json How to use it? computercraft json local val = tonumber(str:sub(1, i - 1)) str = removeWhite(str:sub(i)) return val, str end json.parseNumber = parseNumber local function parseString(str) str = str:sub(2) local s = "" while str:sub(1,1) ~= "\"" do computercraft json How to dowload it? computercraft json local next = str:sub(1,1) str = str:sub(2) assert(next ~= "\n", "Unclosed string") if next == "\\" then local escape = str:sub(1,1) str = str:sub(2) next = assert(decodeControls[next..escape], "Invalid escape character") end computercraft json How to dowload it? computercraft json s = s .. next end return s, removeWhite(str:sub(2)) end json.parseString = parseString local function parseArray(str) str = removeWhite(str:sub(2)) computercraft json How to get it? computercraft json local val = {} local i = 1 while str:sub(1, 1) ~= "]" do local v = nil v, str = json.parseValue(str) val[i] = v i = i + 1 str = removeWhite(str) end str = removeWhite(str:sub(2)) computercraft json How to use it? computercraft json return val, str end json.parseArray = parseArray local function parseObject(str) str = removeWhite(str:sub(2)) local val = {} while str:sub(1, 1) ~= "}" do local k, v = nil, nil computercraft json How to get it? computercraft json k, v, str = json.parseMember(str) val[k] = v str = removeWhite(str) end str = removeWhite(str:sub(2)) return val, str end json.parseObject = parseObject local function parseMember(str) computercraft json How to get it? computercraft json local k = nil k, str = json.parseValue(str) local val = nil val, str = json.parseValue(str) return k, val, str end json.parseMember = parseMember local function parseValue(str) local fchar = str:sub(1, 1) computercraft json How to get it? computercraft json if fchar == "{" then return json.parseObject(str) elseif fchar == "[" then return json.parseArray(str) elseif tonumber(fchar) ~= nil or numChars[fchar] then return json.parseNumber(str) elseif str:sub(1, 4) == "true" or str:sub(1, 5) == "false" then return json.parseBoolean(str) elseif fchar == "\"" then return json.parseString(str) computercraft json How to dowload it? computercraft json elseif str:sub(1, 4) == "null" then return json.parseNull(str) end return nil end json.parseValue = parseValue function decode(str) str = removeWhite(str) t = json.parseValue(str) computercraft json How to dowload it? computercraft json return t end json.decode = decode function decodeFromFile(path) local file = assert(fs.open(path, "r")) local decoded = decode(file.readAll()) file.close() return decoded end computercraft json How to get it? computercraft json json.decodeFromFile = decodeFromFile return json computercraft json