### Steps to reproduce ``` require "minitest/autorun" require "json" class DumpTest < Minitest::Test def test_dump_duplicate_key_hash assert_equal "{\"a\":5,\"c\":{\"b\":6}}", JSON.dump({ 'a' => 1, a: 5, c: { 'b' => 2, b: 6 } }) end end ``` ### Expected behaviour Test case should pass ### Actual behavior ``` Run options: --seed 18012 # Running: F Failure: DumpTest#test_dump_duplicate_key_hash [nano-example.rb:7]: --- expected +++ actual @@ -1 +1 @@ -"{\"a\":5,\"c\":{\"b\":6}}" +"{\"a\":1,\"a\":5,\"c\":{\"b\":2,\"b\":6}}" bin/rails test nano-example.rb:6 Finished in 0.007499s, 133.3511 runs/s, 133.3511 assertions/s. 1 runs, 1 assertions, 1 failures, 0 errors, 0 skips ``` ### System configuration **Ruby version:** `ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [arm64-darwin23]`, `ruby 3.2.0`, `ruby 2.7.8` Same issue got reported in Rails ActiveSupport encode as well. Check it out here: [#50481](https://github.com/rails/rails/issues/50481) cc: @byroot @hsbt
Activity
byroot commentedon Oct 17, 2024
As discussed on #564, I get how this is a problem, but it would be way too clostly to attempt to protect against that.
If for some reasons you get such hashes with mixed keys, I recommend cleaning them up upfront with
transform_keys(&:to_s).