lib/active_support/json.rb in activesupport-1.4.4 vs lib/active_support/json.rb in activesupport-2.0.0

- old
+ new

@@ -1,48 +1,31 @@ -require 'active_support/json/encoders' +require 'active_support/json/encoding' +require 'active_support/json/decoding' module ActiveSupport - module JSON #:nodoc: - class CircularReferenceError < StandardError #:nodoc: - end - - # A string that returns itself as as its JSON-encoded form. - class Variable < String #:nodoc: - def to_json - self - end - end - - # When +true+, Hash#to_json will omit quoting string or symbol keys - # if the keys are valid JavaScript identifiers. Note that this is - # technically improper JSON (all object keys must be quoted), so if - # you need strict JSON compliance, set this option to +false+. - mattr_accessor :unquote_hash_key_identifiers - @@unquote_hash_key_identifiers = true + module JSON + RESERVED_WORDS = %w( + abstract delete goto private transient + boolean do if protected try + break double implements public typeof + byte else import return var + case enum in short void + catch export instanceof static volatile + char extends int super while + class final interface switch with + const finally long synchronized + continue float native this + debugger for new throw + default function package throws + ) #:nodoc: class << self - REFERENCE_STACK_VARIABLE = :json_reference_stack - - def encode(value) - raise_on_circular_reference(value) do - Encoders[value.class].call(value) - end + def valid_identifier?(key) #:nodoc: + key.to_s =~ /^[[:alpha:]_$][[:alnum:]_$]*$/ && !reserved_word?(key) end - - def can_unquote_identifier?(key) - return false unless unquote_hash_key_identifiers - key.to_s =~ /^[[:alpha:]_$][[:alnum:]_$]*$/ + + def reserved_word?(key) #:nodoc: + RESERVED_WORDS.include?(key.to_s) end - - protected - def raise_on_circular_reference(value) - stack = Thread.current[REFERENCE_STACK_VARIABLE] ||= [] - raise CircularReferenceError, 'object references itself' if - stack.include? value - stack << value - yield - ensure - stack.pop - end end end end