Created
September 12, 2016 15:33
-
-
Save Val/53085262b19932f686b8c84a760454cb to your computer and use it in GitHub Desktop.
Crystal JSON vs YAML serialization
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "json" | |
require "yaml" | |
require "secure_random" | |
class SerializableKlass | |
YAML.mapping({ | |
bool: { type: Bool, nilable: true}, | |
float: { type: Float64, nilable: true}, | |
int: { type: Int32, nilable: true}, | |
str: { type: String, nilable: true} | |
}) | |
JSON.mapping({ | |
bool: { type: Bool, nilable: true}, | |
float: { type: Float64, nilable: true}, | |
int: { type: Int32, nilable: true}, | |
str: { type: String, nilable: true} | |
}) | |
RANDOM = Random.new | |
macro add_to_yml(property) | |
unless {{property}}.nil? | |
yaml.nl | |
yaml << "{{property}}: #{@{{property}}}" | |
end | |
end | |
def initialize(bool : (Bool | Nil) = [RANDOM.next_bool, nil].sample, | |
str : (String | Nil) = [SecureRandom.hex, nil].sample, | |
float : (Float64 | Nil) = [RANDOM.next_float, nil].sample, | |
int : (Int32 | Nil) = [RANDOM.next_int, nil].sample) | |
@bool = bool | |
@str = str | |
@float = float | |
@int = int | |
end | |
def to_yaml(yaml : YAML::Generator) | |
yaml.indented do | |
add_to_yml(bool) | |
add_to_yml(str) | |
add_to_yml(float) | |
add_to_yml(int) | |
end | |
end | |
def ==(other) | |
return false unless other.is_a?(SerializableKlass) | |
other.bool == bool && \ | |
other.str == str && \ | |
other.float == float && \ | |
other.int == int | |
end | |
end | |
require "spec" | |
describe SerializableKlass do | |
it "can be serialized to/from JSON" do | |
42.times do | |
object = SerializableKlass.new | |
SerializableKlass.from_json(object.to_json).should eq(object) | |
end | |
end | |
it "can be serialized to/from YAML" do | |
42.times do | |
object = SerializableKlass.new | |
SerializableKlass.from_yaml(object.to_yaml).should eq(object) | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
JSON spec show a
float
serialization problem and YAML parse fail :-/