diff --git a/ext/json/ext/generator/generator.c b/ext/json/ext/generator/generator.c index e4412361..30d575db 100644 --- a/ext/json/ext/generator/generator.c +++ b/ext/json/ext/generator/generator.c @@ -740,7 +740,7 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) long delim2_len = FBUFFER_LEN(state->object_delim2); long depth = state->depth; int j; - VALUE key_to_s; + VALUE klass, key_to_s; if (arg->iter > 0) fbuffer_append(buffer, delim, delim_len); if (object_nl) { @@ -752,7 +752,14 @@ json_object_i(VALUE key, VALUE val, VALUE _arg) } } - key_to_s = rb_funcall(key, i_to_s, 0); + klass = CLASS_OF(key); + if (klass == rb_cString) { + key_to_s = key; + } else if (klass == rb_cSymbol) { + key_to_s = rb_id2str(SYM2ID(key)); + } else { + key_to_s = rb_funcall(key, i_to_s, 0); + } Check_Type(key_to_s, T_STRING); generate_json(buffer, Vstate, state, key_to_s); fbuffer_append(buffer, delim2, delim2_len);