summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-08-23 16:06:38 +0200
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-08-27 10:01:52 +0900
commitc3a80ca58226f588ef393ab5ae1de304eabf9a9d (patch)
treeac1aba279007aec2c3abdb0189cd2beead1d473d
parentd325e3ed706ec356c9439824ed82cbcdb4487859 (diff)
Fix `JSON.generate` `strict: true` mode to also restrict hash keys
-rw-r--r--ext/json/generator/generator.c3
-rwxr-xr-xtest/json/json_generator_test.rb12
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