Advertisement
melzneni

CC_Json

Oct 23rd, 2020 (edited)
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.33 KB | None | 0 0
  1. local std=require "libraries/std"
  2.  
  3. function parse(source)
  4.  
  5. local source,value = consumeValue(source)
  6. source=consumeWhiteSpace(source)
  7.  
  8. if (string.len(source)>0) then error("invalid json input: " .. source) end
  9.  
  10. return value;
  11. end
  12.  
  13. function consumeValue(source)
  14. source = consumeWhiteSpace(source)
  15. local first = string.byte(source);
  16. if first == 123 then --'{'
  17. source = consumeWhiteSpace(string.sub(source, 2))
  18.  
  19. local values={}
  20. while (string.byte(source) ~= 125) do --'}'
  21. local key, value
  22. source, key = consumeValue(source)
  23. source = consumeWhiteSpace(source);
  24. if string.byte(source) ~= 58 then error("invalid json input: " .. source) end --':'
  25. source = consumeWhiteSpace(string.sub(source, 2));
  26. source, value = consumeValue(source)
  27. source = consumeWhiteSpace(source);
  28.  
  29. first=string.byte(source)
  30. if first ~= 44 and first~=125 then error("invalid json input: " .. source) end --',' ':'
  31. if first==44 then
  32. source = consumeWhiteSpace(string.sub(source,2));
  33. end
  34.  
  35. values[key]=value
  36. end
  37. return string.sub(source,2,#source),values
  38. elseif first == 34 then --'"'
  39. local escaped = false
  40. local l = 2
  41. local value = ""
  42.  
  43. while (true) do
  44. local s = string.sub(source, l, l)
  45. if (s == "\\") then
  46. escaped = true
  47. elseif not escaped and s == "\"" then
  48. break;
  49. else value = value .. s
  50. end
  51. l = l + 1;
  52. end
  53. return string.sub(source, l + 1), value
  54. elseif 48<=first and first<=57 then
  55. local l=1
  56. while(48<=first and first<=57) do
  57. first=string.byte(source,l)
  58. l=l+1
  59. end
  60. return string.sub(source,l-1),string.sub(source,1,l-2)
  61. else error("invalid json input: " .. source)
  62. end
  63. end
  64.  
  65. function consumeWhiteSpace(source)
  66. local i = 1;
  67. while (string.len(source) >i-1) do
  68. local c = string.byte(source, i)
  69. if c == 32 or c == 10 or c == 13 then --' \n\r'
  70. i = i + 1;
  71. else break;
  72. end
  73. end
  74. return string.sub(source, i)
  75. end
  76.  
  77. return {
  78. parse=parse
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement