From 293ad8a4e974e3dffc1419b37c15748f02b1481e Mon Sep 17 00:00:00 2001 From: Jean Boussier Date: Mon, 10 Feb 2025 21:09:35 +0100 Subject: [PATCH] Fix a compatibility issue with `MultiJson.dump(obj, pretty: true)` Fix: https://github.com/ruby/json/issues/748 `MultiJson` pass `State#to_h` as options, and the `as_json` property defaults to `false` but `false` wasn't accepted by the constructor. --- ext/json/generator/generator.c | 2 +- test/json/json_generator_test.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c index bb390d1b25..0833885370 100644 --- a/ext/json/generator/generator.c +++ b/ext/json/generator/generator.c @@ -1626,7 +1626,7 @@ static int configure_state_i(VALUE key, VALUE val, VALUE _arg) else if (key == sym_script_safe) { state->script_safe = RTEST(val); } else if (key == sym_escape_slash) { state->script_safe = RTEST(val); } else if (key == sym_strict) { state->strict = RTEST(val); } - else if (key == sym_as_json) { state->as_json = rb_convert_type(val, T_DATA, "Proc", "to_proc"); } + else if (key == sym_as_json) { state->as_json = RTEST(val) ? rb_convert_type(val, T_DATA, "Proc", "to_proc") : Qfalse; } return ST_CONTINUE; } diff --git a/test/json/json_generator_test.rb b/test/json/json_generator_test.rb index 942802d62f..c67cd3349c 100755 --- a/test/json/json_generator_test.rb +++ b/test/json/json_generator_test.rb @@ -399,6 +399,11 @@ class JSONGeneratorTest < Test::Unit::TestCase assert_equal :bar, state_hash[:foo] end + def test_json_state_to_h_roundtrip + state = JSON.state.new + assert_equal state.to_h, JSON.state.new(state.to_h).to_h + end + def test_json_generate assert_raise JSON::GeneratorError do generate(["\xea"])