Advertisement
Deukhoofd

Untitled

Sep 5th, 2017
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 7.30 KB | None | 0 0
  1. #===============================================================================
  2. # JSON Encoder/Decoder
  3. # Version 1.1
  4. # Author: game_guy, modified by Deukhoofd for more extensibility
  5. #-------------------------------------------------------------------------------
  6. # Intro:
  7. # JSON (JavaScript Object Notation) is a lightweight data-interchange
  8. # format. It is easy for humans to read and write. It is easy for machines to
  9. # parse and generate.
  10. # This is a simple JSON Parser or Decoder. It'll take JSON thats been
  11. # formatted into a string and decode it into the proper object.
  12. # This script can also encode certain ruby objects into JSON.
  13. #
  14. # Features:
  15. # Decodes JSON format into ruby strings, arrays, hashes, integers, booleans.
  16. #
  17. # Instructions:
  18. # This is a scripters utility. To decode JSON data, call
  19. # JSON.decode("json string")
  20. # -Depending on "json string", this method can return any of the values:
  21. #  -Integer
  22. #  -String
  23. #  -Boolean
  24. #  -Hash
  25. #  -Array
  26. #  -Nil
  27. #
  28. # To Encode objects, use
  29. # JSON.encode(object)
  30. # -This will return a string with JSON. Object can be any one of the following
  31. #  -Integer
  32. #  -String
  33. #  -Boolean
  34. #  -Hash
  35. #  -Array
  36. #  -Nil
  37. #
  38. # Credits:
  39. # game_guy ~ Creating it.
  40. #===============================================================================
  41. module JSON
  42.  
  43.   TOKEN_NONE = 0;
  44.   TOKEN_CURLY_OPEN = 1;
  45.   TOKEN_CURLY_CLOSED = 2;
  46.   TOKEN_SQUARED_OPEN = 3;
  47.   TOKEN_SQUARED_CLOSED = 4;
  48.   TOKEN_COLON = 5;
  49.   TOKEN_COMMA = 6;
  50.   TOKEN_STRING = 7;
  51.   TOKEN_NUMBER = 8;
  52.   TOKEN_TRUE = 9;
  53.   TOKEN_FALSE = 10;
  54.   TOKEN_NULL = 11;
  55.  
  56.   @index = 0
  57.   @json = ""
  58.   @length = 0
  59.  
  60.   def self.decode(json)
  61. #    File.open("data.json", 'w') { |file| file.write(json) }
  62.     @json = json
  63.     @index = 0
  64.     @length = @json.length
  65.     return self.parse
  66.   end
  67.  
  68.   def self.encode(obj)
  69.     if obj.is_a?(Hash)
  70.       return self.encode_hash(obj)
  71.     elsif obj.is_a?(Array)
  72.       return self.encode_array(obj)
  73.     elsif obj.is_a?(Fixnum) || obj.is_a?(Float) || obj.is_a?(Integer)
  74.       return self.encode_integer(obj)
  75.     elsif obj.is_a?(String)
  76.       return self.encode_string(obj)
  77.     elsif obj.is_a?(TrueClass) || obj.is_a?(FalseClass)
  78.       return self.encode_bool(obj)
  79.     elsif obj.is_a?(NilClass)
  80.       return "null"
  81.     elsif obj.is_a?(Object)
  82.       return encode_object(obj)
  83.     end
  84.     return nil
  85.   end
  86.   specificAttrs = [""]
  87.   def self.encode_object(o)
  88.     s = "{"
  89.     a = o.instance_variables
  90.         for i in 0..(a.length - 1)
  91.             v = a[i]
  92.             if v.nil?
  93.                 next
  94.             end
  95.             vname= v
  96.             va = o.instance_variable_get(v)
  97.             if v[0..0] == '@'
  98.                 vname[0..0] = ''
  99.             end
  100.             s = s + "\"" + v + "\": "
  101.             if !va.nil?
  102.                 s = s + self.encode(va)
  103.                 if i != a.length - 1
  104.                     s = s + " ,"
  105.                 end
  106.             else
  107.                 s = s + "\"\","
  108.             end
  109.         end
  110.     if o.respond_to? :jsonarr
  111.       methodarr = o.jsonarr
  112.       for i in 0..(methodarr.length - 1)
  113.         sarr = methodarr[i].to_s.split('#')
  114.         methodname = sarr[sarr.length - 1].chomp('>').chomp('?')
  115.         if (s[-1, 1]) != ','
  116.             s += " ,"
  117.         s += "\"" + methodname + "\": " + self.encode(methodarr[i].call)
  118.       end
  119.     end
  120.         return s + "}"
  121.   end
  122.  
  123.   def self.encode_hash(hash)
  124.     string = "{"
  125.     hash.each_key {|key|
  126.       string += "\"#{key}\":" + self.encode(hash[key]).to_s + ","
  127.     }
  128.     string[string.size - 1, 1] = "}"
  129.     return string
  130.   end
  131.  
  132.   def self.encode_array(array)
  133.     string = "["
  134.     array.each {|i|
  135.       string += self.encode(i).to_s + ","
  136.     }
  137.     if string.length > 1
  138.         string[string.size - 1, 1] = "]"
  139.     else
  140.         string += "]"
  141.     end
  142.     return string
  143.   end
  144.  
  145.   def self.encode_string(string)
  146.     return "\"#{string}\""
  147.   end
  148.  
  149.   def self.encode_integer(int)
  150.     return int.to_s
  151.   end
  152.  
  153.   def self.encode_bool(bool)
  154.     return (bool.is_a?(TrueClass) ? "true" : "false")
  155.   end
  156.  
  157.   def self.next_token(debug = 0)
  158.     char = @json[@index, 1]
  159.     @index += 1
  160.     case char
  161.     when '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-'
  162.       return TOKEN_NUMBER
  163.     when '{'
  164.       return TOKEN_CURLY_OPEN
  165.     when '}'
  166.       return TOKEN_CURLY_CLOSED
  167.     when '"'
  168.       return TOKEN_STRING
  169.     when ','
  170.       return TOKEN_COMMA
  171.     when '['
  172.       return TOKEN_SQUARED_OPEN
  173.     when ']'
  174.       return TOKEN_SQUARED_CLOSED
  175.     when ':'
  176.       return TOKEN_COLON
  177.     when ' '
  178.       return self.next_token
  179.     end
  180.     @index -= 1
  181.     if @json[@index, 5] == "false"
  182.       @index += 5
  183.       return TOKEN_FALSE
  184.     elsif @json[@index, 4] == "true"
  185.       @index += 4
  186.       return TOKEN_TRUE
  187.     elsif @json[@index, 4] == "null"
  188.       @index += 4
  189.       return TOKEN_NULL
  190.     end
  191.     return TOKEN_NONE
  192.   end
  193.  
  194.   def self.parse(debug = 0)
  195.     complete = false
  196.     while !complete
  197.       if @index >= @length
  198.         break
  199.       end
  200.       token = self.next_token
  201.       case token
  202.       when TOKEN_NONE
  203.         return nil
  204.       when TOKEN_NUMBER
  205.         return self.parse_number
  206.       when TOKEN_CURLY_OPEN
  207.         return self.parse_object
  208.       when TOKEN_STRING
  209.         return self.parse_string
  210.       when TOKEN_SQUARED_OPEN
  211.         return self.parse_array
  212.       when TOKEN_TRUE
  213.         return true
  214.       when TOKEN_FALSE
  215.         return false
  216.       when TOKEN_NULL
  217.         return nil
  218.       end
  219.     end
  220.   end
  221.  
  222.   def self.parse_object
  223.     obj = {}
  224.     complete = false
  225.     while !complete
  226.       token = self.next_token
  227.       if token == TOKEN_CURLY_CLOSED
  228.         complete = true
  229.         break
  230.       elsif token == TOKEN_NONE
  231.         Kernel.pbMessage(@json[@index - 8, 8])
  232.         return nil
  233.       elsif token == TOKEN_COMMA
  234.       else
  235.         name = self.parse_string
  236.         return nil if name == nil
  237.         token = self.next_token
  238.         if token != TOKEN_COLON
  239.           raise "wrong token"
  240.           return null
  241.         end
  242.         value = self.parse
  243.         obj[name] = value
  244.       end
  245.     end
  246.     return obj
  247.   end
  248.  
  249.   def self.parse_string
  250.     complete = false
  251.     string = ""
  252.     while !complete
  253.       break if @index >= @length
  254.       char = @json[@index, 1]
  255.       oldchar = @json[@index - 1, 1]
  256.       @index += 1
  257.       if char == '"' && oldchar != "\\"
  258.         complete = true
  259.         break
  260.       else
  261.         string += char.to_s
  262.       end
  263.     end
  264.     if !complete
  265.       raise "incomplete string"
  266.       return nil
  267.     end
  268.     return string
  269.   end
  270.  
  271.   def self.parse_number
  272.     @index -= 1
  273.     negative = @json[@index, 1] == "-" ? true : false
  274.     string = ""
  275.     complete = false
  276.     while !complete
  277.       break if @index >= @length
  278.       char = @json[@index, 1]
  279.       @index += 1
  280.       case char
  281.       when "{", "}", ":", ",", "[", "]"
  282.         @index -= 1
  283.         complete = true
  284.         break
  285.       when "0", "1", "2", '3', '4', '5', '6', '7', '8', '9'
  286.         string += char.to_s
  287.       end
  288.     end
  289.     return string.to_i
  290.   end
  291.  
  292.   def self.parse_array
  293.     obj = []
  294.     complete = false
  295.     while !complete
  296.       token = self.next_token(1)
  297.       if token == TOKEN_SQUARED_CLOSED
  298.         complete = true
  299.         break
  300.       elsif token == TOKEN_NONE
  301.         raise "null token array"
  302.         return nil
  303.       elsif token == TOKEN_COMMA
  304.       else
  305.         @index -= 1
  306.         value = self.parse
  307.         obj.push(value)
  308.       end
  309.     end
  310.     return obj
  311.   end
  312.  
  313. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement