summaryrefslogtreecommitdiff
path: root/ext/json/lib
diff options
context:
space:
mode:
Diffstat (limited to 'ext/json/lib')
-rw-r--r--ext/json/lib/json.rb8
-rw-r--r--ext/json/lib/json/add/core.rb42
-rw-r--r--ext/json/lib/json/common.rb82
-rw-r--r--ext/json/lib/json/ext.rb17
4 files changed, 93 insertions, 56 deletions
diff --git a/ext/json/lib/json.rb b/ext/json/lib/json.rb
index d7bc1a2d23..00fe4cae84 100644
--- a/ext/json/lib/json.rb
+++ b/ext/json/lib/json.rb
@@ -7,13 +7,13 @@
#
# Built on two universally available structures:
# 1. A collection of name/value pairs. Often referred to as an _object_, hash table, record, struct, keyed list, or associative array.
-# 2. An orderd list of values. More commonly named as an _array_, vector, sequence, or list.
+# 2. An ordered list of values. More commonly called an _array_, vector, sequence or list.
#
# To read more about JSON visit: http://json.org
#
# == Parsing JSON
#
-# To parse a JSON string received by another application, or generated within
+# To parse a JSON string received by another application or generated within
# your existing application:
#
# require 'json'
@@ -42,8 +42,8 @@
# puts {:hello => "goodbye"}.to_json => "{\"hello\":\"goodbye\"}"
#
# <tt>JSON.generate</tt> only allows objects or arrays to be converted
-# to JSON syntax. While <tt>to_json</tt> accepts many Ruby classes
-# even though it only acts a method for serialization:
+# to JSON syntax. <tt>to_json</tt>, however, accepts many Ruby classes
+# even though it acts only as a method for serialization:
#
# require 'json'
#
diff --git a/ext/json/lib/json/add/core.rb b/ext/json/lib/json/add/core.rb
index e9850af8f6..fde53a4d01 100644
--- a/ext/json/lib/json/add/core.rb
+++ b/ext/json/lib/json/add/core.rb
@@ -5,6 +5,8 @@ unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
require 'json'
end
require 'date'
+require 'complex'
+require 'rational'
# Symbol serialization/deserialization
class Symbol
@@ -230,8 +232,8 @@ class Regexp
def as_json(*)
{
JSON.create_id => self.class.name,
- 'o' => options,
- 's' => source,
+ 'o' => options,
+ 's' => source,
}
end
@@ -241,3 +243,39 @@ class Regexp
as_json.to_json
end
end
+
+class Rational
+ def self.json_create(object)
+ Rational(object['n'], object['d'])
+ end
+
+ def as_json(*)
+ {
+ JSON.create_id => self.class.name,
+ 'n' => numerator,
+ 'd' => denominator,
+ }
+ end
+
+ def to_json(*)
+ as_json.to_json
+ end
+end
+
+class Complex
+ def self.json_create(object)
+ Complex(object['r'], object['i'])
+ end
+
+ def as_json(*)
+ {
+ JSON.create_id => self.class.name,
+ 'r' => real,
+ 'i' => imag,
+ }
+ end
+
+ def to_json(*)
+ as_json.to_json
+ end
+end
diff --git a/ext/json/lib/json/common.rb b/ext/json/lib/json/common.rb
index 1a5f0481e8..43e249c954 100644
--- a/ext/json/lib/json/common.rb
+++ b/ext/json/lib/json/common.rb
@@ -2,11 +2,11 @@ require 'json/version'
module JSON
class << self
- # If _object_ is string-like parse the string and return the parsed result
+ # If _object_ is string-like, parse the string and return the parsed result
# as a Ruby data structure. Otherwise generate a JSON text from the Ruby
# data structure object and return it.
#
- # The _opts_ argument is passed through to generate/parse respectively, see
+ # The _opts_ argument is passed through to generate/parse respectively. See
# generate and parse for their documentation.
def [](object, opts = {})
if object.respond_to? :to_str
@@ -16,7 +16,7 @@ module JSON
end
end
- # Returns the JSON parser class, that is used by JSON. This might be either
+ # Returns the JSON parser class that is used by JSON. This is either
# JSON::Ext::Parser or JSON::Pure::Parser.
attr_reader :parser
@@ -28,7 +28,7 @@ module JSON
end
# Return the constant located at _path_. The format of _path_ has to be
- # either ::A::B::C or A::B::C. In any case A has to be located at the top
+ # either ::A::B::C or A::B::C. In any case, A has to be located at the top
# level (absolute namespace path?). If there doesn't exist a constant at
# the given path, an ArgumentError is raised.
def deep_const_get(path) # :nodoc:
@@ -81,15 +81,15 @@ module JSON
$VERBOSE = old
end
- # Returns the JSON generator modul, that is used by JSON. This might be
+ # Returns the JSON generator module that is used by JSON. This is
# either JSON::Ext::Generator or JSON::Pure::Generator.
attr_reader :generator
- # Returns the JSON generator state class, that is used by JSON. This might
- # be either JSON::Ext::Generator::State or JSON::Pure::Generator::State.
+ # Returns the JSON generator state class that is used by JSON. This is
+ # either JSON::Ext::Generator::State or JSON::Pure::Generator::State.
attr_accessor :state
- # This is create identifier, that is used to decide, if the _json_create_
+ # This is create identifier, which is used to decide if the _json_create_
# hook of a class should be called. It defaults to 'json_class'.
attr_accessor :create_id
end
@@ -104,10 +104,10 @@ module JSON
# The base exception for JSON errors.
class JSONError < StandardError; end
- # This exception is raised, if a parser error occurs.
+ # This exception is raised if a parser error occurs.
class ParserError < JSONError; end
- # This exception is raised, if the nesting of parsed datastructures is too
+ # This exception is raised if the nesting of parsed data structures is too
# deep.
class NestingError < ParserError; end
@@ -115,13 +115,13 @@ module JSON
class CircularDatastructure < NestingError; end
# :startdoc:
- # This exception is raised, if a generator or unparser error occurs.
+ # This exception is raised if a generator or unparser error occurs.
class GeneratorError < JSONError; end
# For backwards compatibility
UnparserError = GeneratorError
- # This exception is raised, if the required unicode support is missing on the
- # system. Usually this means, that the iconv library is not installed.
+ # This exception is raised if the required unicode support is missing on the
+ # system. Usually this means that the iconv library is not installed.
class MissingUnicodeSupport < JSONError; end
module_function
@@ -131,16 +131,16 @@ module JSON
# _opts_ can have the following
# keys:
# * *max_nesting*: The maximum depth of nesting allowed in the parsed data
- # structures. Disable depth checking with :max_nesting => false, it defaults
+ # structures. Disable depth checking with :max_nesting => false. It defaults
# to 19.
# * *allow_nan*: If set to true, allow NaN, Infinity and -Infinity in
# defiance of RFC 4627 to be parsed by the Parser. This option defaults
# to false.
# * *symbolize_names*: If set to true, returns symbols for the names
- # (keys) in a JSON object. Otherwise strings are returned, which is also
+ # (keys) in a JSON object. Otherwise strings are returned. Strings are
# the default.
# * *create_additions*: If set to false, the Parser doesn't create
- # additions even if a matchin class and create_id was found. This option
+ # additions even if a matching class and create_id was found. This option
# defaults to true.
# * *object_class*: Defaults to Hash
# * *array_class*: Defaults to Array
@@ -149,19 +149,19 @@ module JSON
end
# Parse the JSON document _source_ into a Ruby data structure and return it.
- # The bang version of the parse method, defaults to the more dangerous values
+ # The bang version of the parse method defaults to the more dangerous values
# for the _opts_ hash, so be sure only to parse trusted _source_ documents.
#
# _opts_ can have the following keys:
# * *max_nesting*: The maximum depth of nesting allowed in the parsed data
# structures. Enable depth checking with :max_nesting => anInteger. The parse!
- # methods defaults to not doing max depth checking: This can be dangerous,
+ # methods defaults to not doing max depth checking: This can be dangerous
# if someone wants to fill up your stack.
# * *allow_nan*: If set to true, allow NaN, Infinity, and -Infinity in
# defiance of RFC 4627 to be parsed by the Parser. This option defaults
# to true.
# * *create_additions*: If set to false, the Parser doesn't create
- # additions even if a matchin class and create_id was found. This option
+ # additions even if a matching class and create_id was found. This option
# defaults to true.
def parse!(source, opts = {})
opts = {
@@ -188,7 +188,7 @@ module JSON
# * *object_nl*: a string that is put at the end of a JSON object (default: ''),
# * *array_nl*: a string that is put at the end of a JSON array (default: ''),
# * *allow_nan*: true if NaN, Infinity, and -Infinity should be
- # generated, otherwise an exception is thrown, if these values are
+ # generated, otherwise an exception is thrown if these values are
# encountered. This options defaults to false.
# * *max_nesting*: The maximum depth of nesting allowed in the data
# structures from which JSON is to be generated. Disable depth checking
@@ -196,9 +196,13 @@ module JSON
#
# See also the fast_generate for the fastest creation method with the least
# amount of sanity checks, and the pretty_generate method for some
- # defaults for a pretty output.
+ # defaults for pretty output.
def generate(obj, opts = nil)
- state = SAFE_STATE_PROTOTYPE.dup
+ if State === opts
+ state, opts = opts, nil
+ else
+ state = SAFE_STATE_PROTOTYPE.dup
+ end
if opts
if opts.respond_to? :to_hash
opts = opts.to_hash
@@ -223,9 +227,13 @@ module JSON
# This method disables the checks for circles in Ruby objects.
#
# *WARNING*: Be careful not to pass any Ruby data structures with circles as
- # _obj_ argument, because this will cause JSON to go into an infinite loop.
+ # _obj_ argument because this will cause JSON to go into an infinite loop.
def fast_generate(obj, opts = nil)
- state = FAST_STATE_PROTOTYPE.dup
+ if State === opts
+ state, opts = opts, nil
+ else
+ state = FAST_STATE_PROTOTYPE.dup
+ end
if opts
if opts.respond_to? :to_hash
opts = opts.to_hash
@@ -249,10 +257,14 @@ module JSON
# The returned document is a prettier form of the document returned by
# #unparse.
#
- # The _opts_ argument can be used to configure the generator, see the
+ # The _opts_ argument can be used to configure the generator. See the
# generate method for a more detailed explanation.
def pretty_generate(obj, opts = nil)
- state = PRETTY_STATE_PROTOTYPE.dup
+ if State === opts
+ state, opts = opts, nil
+ else
+ state = PRETTY_STATE_PROTOTYPE.dup
+ end
if opts
if opts.respond_to? :to_hash
opts = opts.to_hash
@@ -273,7 +285,7 @@ module JSON
# :startdoc:
# Load a ruby data structure from a JSON _source_ and return it. A source can
- # either be a string-like object, an IO like object, or an object responding
+ # either be a string-like object, an IO-like object, or an object responding
# to the read method. If _proc_ was given, it will be called with any nested
# Ruby object as an argument recursively in depth first order.
#
@@ -312,10 +324,10 @@ module JSON
# Dumps _obj_ as a JSON string, i.e. calls generate on the object and returns
# the result.
#
- # If anIO (an IO like object or an object that responds to the write method)
+ # If anIO (an IO-like object or an object that responds to the write method)
# was given, the resulting JSON is written to it.
#
- # If the number of nested arrays or objects exceeds _limit_ an ArgumentError
+ # If the number of nested arrays or objects exceeds _limit_, an ArgumentError
# exception is raised. This argument is similar (but not exactly the
# same!) to the _limit_ argument in Marshal.dump.
#
@@ -396,11 +408,11 @@ module ::Kernel
nil
end
- # If _object_ is string-like parse the string and return the parsed result as
- # a Ruby data structure. Otherwise generate a JSON text from the Ruby data
+ # If _object_ is string-like, parse the string and return the parsed result as
+ # a Ruby data structure. Otherwise, generate a JSON text from the Ruby data
# structure object and return it.
#
- # The _opts_ argument is passed through to generate/parse respectively, see
+ # The _opts_ argument is passed through to generate/parse respectively. See
# generate and parse for their documentation.
def JSON(object, *args)
if object.respond_to? :to_str
@@ -413,10 +425,10 @@ end
# Extends any Class to include _json_creatable?_ method.
class ::Class
- # Returns true, if this class can be used to create an instance
+ # Returns true if this class can be used to create an instance
# from a serialised JSON string. The class has to implement a class
- # method _json_create_ that expects a hash as first parameter, which includes
- # the required data.
+ # method _json_create_ that expects a hash as first parameter. The hash
+ # should include the required data.
def json_creatable?
respond_to?(:json_create)
end
diff --git a/ext/json/lib/json/ext.rb b/ext/json/lib/json/ext.rb
index 1fbc3fd7d1..7264a857fa 100644
--- a/ext/json/lib/json/ext.rb
+++ b/ext/json/lib/json/ext.rb
@@ -4,21 +4,8 @@ module JSON
# This module holds all the modules/classes that implement JSON's
# functionality as C extensions.
module Ext
- begin
- if defined?(RUBY_ENGINE) == 'constant' and RUBY_ENGINE == 'ruby' and RUBY_VERSION =~ /\A1\.9\./
- require 'json/ext/1.9/parser'
- require 'json/ext/1.9/generator'
- elsif !defined?(RUBY_ENGINE) && RUBY_VERSION =~ /\A1\.8\./
- require 'json/ext/1.8/parser'
- require 'json/ext/1.8/generator'
- else
- require 'json/ext/parser'
- require 'json/ext/generator'
- end
- rescue LoadError
- require 'json/ext/parser'
- require 'json/ext/generator'
- end
+ require 'json/ext/parser'
+ require 'json/ext/generator'
$DEBUG and warn "Using Ext extension for JSON."
JSON.parser = Parser
JSON.generator = Generator