summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosh Kline <github.com@track.jonfram.net>2013-12-28 15:37:33 -0800
committerFlorian Frank <flori@ping.de>2017-10-04 17:20:44 +0200
commit06f93995137e0a61dd829fef3306fde262f88628 (patch)
tree2f9d98720cf4bd9228c8199ca003c5eac9183624
parent23825068ced076d5d8e1b1808430dfd860deec36 (diff)
downloadjson-06f93995137e0a61dd829fef3306fde262f88628.tar.gz
JSON marshalling support for Set and SortedSet
-rw-r--r--lib/json/add/set.rb29
-rw-r--r--tests/json_addition_test.rb10
2 files changed, 39 insertions, 0 deletions
diff --git a/lib/json/add/set.rb b/lib/json/add/set.rb
new file mode 100644
index 0000000..71e2a0a
--- /dev/null
+++ b/lib/json/add/set.rb
@@ -0,0 +1,29 @@
+unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
+ require 'json'
+end
+defined?(::Set) or require 'set'
+
+class Set
+ # Import a JSON Marshalled object.
+ #
+ # method used for JSON marshalling support.
+ def self.json_create(object)
+ new object['a']
+ end
+
+ # Marshal the object to JSON.
+ #
+ # method used for JSON marshalling support.
+ def as_json(*)
+ {
+ JSON.create_id => self.class.name,
+ 'a' => to_a,
+ }
+ end
+
+ # return the JSON value
+ def to_json(*args)
+ as_json.to_json(*args)
+ end
+end
+
diff --git a/tests/json_addition_test.rb b/tests/json_addition_test.rb
index a028e0f..61625f8 100644
--- a/tests/json_addition_test.rb
+++ b/tests/json_addition_test.rb
@@ -5,6 +5,7 @@ require 'json/add/complex'
require 'json/add/rational'
require 'json/add/bigdecimal'
require 'json/add/ostruct'
+require 'json/add/set'
require 'date'
class JSONAdditionTest < Test::Unit::TestCase
@@ -190,4 +191,13 @@ class JSONAdditionTest < Test::Unit::TestCase
o.foo = { 'bar' => true }
assert_equal o, parse(JSON(o), :create_additions => true)
end
+
+ def test_set
+ s = Set.new([:a, :b, :c, :a])
+ assert_equal s, JSON.parse(JSON(s), :create_additions => true)
+ ss = SortedSet.new([:d, :b, :a, :c])
+ ss_again = JSON.parse(JSON(ss), :create_additions => true)
+ assert_kind_of ss.class, ss_again
+ assert_equal ss, ss_again
+ end
end