diff options
| author | Jean Boussier <jean.boussier@gmail.com> | 2025-08-23 16:58:54 +0200 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2025-08-27 10:01:52 +0900 |
| commit | 0e0f0dfd070fc156ec74c58f44d86a884a0580e0 (patch) | |
| tree | 35fd9b889a7759ab8e87bdd9ba1ee64400dd528d /ext/json | |
| parent | c3a80ca58226f588ef393ab5ae1de304eabf9a9d (diff) | |
Fix `JSON::Coder` to cast non-string keys.
Diffstat (limited to 'ext/json')
| -rw-r--r-- | ext/json/generator/generator.c | 11 |
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; |
