summaryrefslogtreecommitdiff
path: root/lib/json/add/struct.rb
diff options
context:
space:
mode:
authorFlorian Frank <flori@ping.de>2011-09-12 20:04:08 +0200
committerFlorian Frank <flori@ping.de>2011-09-12 20:04:08 +0200
commit05f22914aa8679e17588995eb334b4c4335c9265 (patch)
treeced9a145c489f755c91b9220fd0191d31e54bf4f /lib/json/add/struct.rb
parentf0adb8f0c89192aea4bb36ff8c2414e247477fcf (diff)
downloadjson-05f22914aa8679e17588995eb334b4c4335c9265.tar.gz
Split all implementations into single files
This way it's easier to create one's own serialisations by picking just the desired ones and mixing them with one's own implementations.
Diffstat (limited to 'lib/json/add/struct.rb')
-rw-r--r--lib/json/add/struct.rb30
1 files changed, 30 insertions, 0 deletions
diff --git a/lib/json/add/struct.rb b/lib/json/add/struct.rb
new file mode 100644
index 0000000..6847cde
--- /dev/null
+++ b/lib/json/add/struct.rb
@@ -0,0 +1,30 @@
+unless defined?(::JSON::JSON_LOADED) and ::JSON::JSON_LOADED
+ require 'json'
+end
+
+# Struct serialization/deserialization
+class Struct
+
+ # Deserializes JSON string by constructing new Struct object with values
+ # <tt>v</tt> serialized by <tt>to_json</tt>.
+ def self.json_create(object)
+ new(*object['v'])
+ end
+
+ # Returns a hash, that will be turned into a JSON object and represent this
+ # object.
+ def as_json(*)
+ klass = self.class.name
+ klass.to_s.empty? and raise JSON::JSONError, "Only named structs are supported!"
+ {
+ JSON.create_id => klass,
+ 'v' => values,
+ }
+ end
+
+ # Stores class name (Struct) with Struct values <tt>v</tt> as a JSON string.
+ # Only named structs are supported.
+ def to_json(*args)
+ as_json.to_json(*args)
+ end
+end