diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2025-08-23 16:06:38 +0200 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-08-27 10:01:52 +0900 |
| commit | c3a80ca58226f588ef393ab5ae1de304eabf9a9d (patch) | |
| tree | ac1aba279007aec2c3abdb0189cd2beead1d473d | |
| parent | d325e3ed706ec356c9439824ed82cbcdb4487859 (diff) | |
Fix `JSON.generate` `strict: true` mode to also restrict hash keys
| -rw-r--r-- | ext/json/generator/generator.c | 3 | ||||
| -rwxr-xr-x | test/json/json_generator_test.rb | 12 |
2 files changed, 15 insertions, 0 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index af6ba16e3f..c71e2f28a7 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -1038,6 +1038,9 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) key_to_s = rb_sym2str(key); break; default: + if (data->state->strict) { + raise_generator_error(key, "%"PRIsVALUE" not allowed in JSON", rb_funcall(key, i_to_s, 0)); + } key_to_s = rb_convert_type(key, T_STRING, "String", "to_s"); break; } diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index 914b3f4ed0..963350ea49 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -404,6 +404,18 @@ class JSONGeneratorTest < Test::Unit::TestCase assert_raise JSON::GeneratorError do generate(Object.new, strict: true) end + + assert_raise JSON::GeneratorError do + generate([Object.new], strict: true) + end + + assert_raise JSON::GeneratorError do + generate({ "key" => Object.new }, strict: true) + end + + assert_raise JSON::GeneratorError do + generate({ Object.new => "value" }, strict: true) + end end def test_nesting |
