diff --git a/lib/json/pure/generator.rb b/lib/json/pure/generator.rb index c85222cc..36b97b47 100644 --- a/lib/json/pure/generator.rb +++ b/lib/json/pure/generator.rb @@ -354,7 +354,7 @@ def json_transform(state) result << delim unless first result << state.indent * depth if indent result = "#{result}#{key.to_s.to_json(state)}#{state.space_before}:#{state.space}" - if state.strict? + if state.strict? && !(!value || value == true || value.is_a?(Array) || value.is_a?(Integer) || value.is_a?(Float) || value.is_a?(String)) raise GeneratorError, "#{value.class} not allowed in JSON" elsif value.respond_to?(:to_json) result << value.to_json(state) @@ -397,7 +397,7 @@ def json_transform(state) each { |value| result << delim unless first result << state.indent * depth if indent - if state.strict? + if state.strict? && !(!value || value == true || value.is_a?(Array) || value.is_a?(Integer) || value.is_a?(Float) || value.is_a?(String)) raise GeneratorError, "#{value.class} not allowed in JSON" elsif value.respond_to?(:to_json) result << value.to_json(state) diff --git a/tests/json_generator_test.rb b/tests/json_generator_test.rb index 526bb8c1..8fb5366a 100755 --- a/tests/json_generator_test.rb +++ b/tests/json_generator_test.rb @@ -67,6 +67,24 @@ def test_dump_unenclosed_hash def test_dump_strict assert_equal '{}', dump({}, strict: true) + + assert_equal '{"array":[42,4.2,"forty-two",true,false,null]}', dump({ + "array" => [42, 4.2, "forty-two", true, false, nil] + }, strict: true) + + assert_equal '{"int":42,"float":4.2,"string":"forty-two","true":true,"false":false,"nil":null}', dump({ + "int" => 42, + "float" => 4.2, + "string" => "forty-two", + "true" => true, + "false" => false, + "nil" => nil, + }, strict: true) + + assert_equal '[]', dump([], strict: true) + + assert_equal '42', dump(42, strict: true) + assert_equal 'true', dump(true, strict: true) end def test_generate_pretty