And here's my solution. It passes all given tests but still there are some tricky cases not handled well (see: code comments). I used regular expressions extensively but it may not be the best idea in terms of performance. Thanks for the quiz!! #!/usr/bin/env ruby # Solution to Ruby Quiz #155 (see http://www.rubyquiz.com/quiz155.html) # by Pawe=B3 Radecki (pawel.j.radecki / gmail.com). $KCODE=3D'UTF-8' require 'jcode' class JSONParser def parse(input) case input # TODO: in every case we need to check if pattern matches the input thoroughly and nothing is left; # ex. "[3, 5] Pablos" still not handled well, it passes through instead of giving exception when '' : raise RuntimeError # TODO: There needs to be some smart way of choosing whether we found an object or an array; # now object has priority and it may be found instead of an array #object when /\{(".+"):(.+)\s*(,\s*(".+"):(.+))+\}/ then h =3D Hash.new $&[1...-1].split(/(.*:.*)?\s*,\s*(.*:.*)?/).each do |e| a =3D e.split(/:\s*(\{.*\}\s*)?/); h[parse(a.first)] =3D parse(a.last) unless (a.first.nil? && a.last.nil?) end h when /\{\s*(".+")\s*:\s*(.+)\s*\}/ then { parse($1) =3D> parse($2) } when /\{\s*\}/ : Hash.new #array when /\[.+\]/ then $&[1...-1].split(/(\[.*\])?\s*,\s*(\[.* \])?/).collect{|e| parse(e)} when /\[\s*\]/ then [] #constants when /true/ then if ($`.strip.empty? && $'.strip.empty?) then true else raise RuntimeError end when /false/ then if ($`.strip.empty? && $'.strip.empty?) then false else raise RuntimeError end when /null/ then nil if ($`.strip.empty? && $'.strip.empty?) then nil else raise RuntimeError end #string when /"([A-Za-z]|(\s)|(\\")|(\\\\)|(\\\/)|(\\b)|(\\f)|(\\n)|(\\r)| (\\t)|(\\u[0-9a-fA-F]{4,4}))+"/ : $&[1...-1].gsub(/\\"/, '"').gsub(/\ \n/, "\n").gsub(/\\u([0-9a-fA-F]{4,4})/u){["#$1".hex ].pack('U*')} when /""/ then "" #number when /-?(0|([1-9][0-9]*))(\.[0-9]+)?([e|E][+|-]?[0-9]+)?/ then if ($`.strip.empty? && $'.strip.empty?) then eval($&) else raise RuntimeError end else raise RuntimeError end end end #puts JSONParser.new.parse(ARGV.first) -- Pawe=B3 Radecki e: pawel.j.radecki / gmail.com w: http://radeckimarch.blogspot.com/