summaryrefslogtreecommitdiff
path: root/ext/json
diff options
context:
space:
mode:
authorJean Boussier <jean.boussier@gmail.com>2025-08-23 16:58:54 +0200
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2025-08-27 10:01:52 +0900
commit0e0f0dfd070fc156ec74c58f44d86a884a0580e0 (patch)
tree35fd9b889a7759ab8e87bdd9ba1ee64400dd528d /ext/json
parentc3a80ca58226f588ef393ab5ae1de304eabf9a9d (diff)
Fix `JSON::Coder` to cast non-string keys.
Diffstat (limited to 'ext/json')
-rw-r--r--ext/json/generator/generator.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index c71e2f28a7..52dcd24f0e 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -1026,6 +1026,9 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
}
VALUE key_to_s;
+ bool as_json_called = false;
+
+ start:
switch (rb_type(key)) {
case T_STRING:
if (RB_LIKELY(RBASIC_CLASS(key) == rb_cString)) {
@@ -1039,7 +1042,13 @@ json_object_i(VALUE key, VALUE val, VALUE _arg)
break;
default:
if (data->state->strict) {
- raise_generator_error(key, "%"PRIsVALUE" not allowed in JSON", rb_funcall(key, i_to_s, 0));
+ if (RTEST(data->state->as_json) && !as_json_called) {
+ key = rb_proc_call_with_block(data->state->as_json, 1, &key, Qnil);
+ as_json_called = true;
+ goto start;
+ } else {
+ raise_generator_error(key, "%"PRIsVALUE" not allowed as object key in JSON", CLASS_OF(key));
+ }
}
key_to_s = rb_convert_type(key, T_STRING, "String", "to_s");
break;