[Ignore/delete this post. I misunderstood the issue. The hash is still a red herring, but the rest doesn't apply. Differences in the choice of back-end could still be relevant, but it's not the only possibility. I don't have time to look deeper right now.]
The hash is a red herring. The results of mathematical operators are numbers, and the result of concatenation is a string. Period.
$ perl -MJSON -E'
say encode_json({ a=>"7", b=>8, c=>"1"+"8", d=>1 . 0 });
'
{"a":"7","b":8,"c":9,"d":"10"}
You also asked about changes in behaviour. Keep in mind that JSON is a merely front for JSON::XS, but it defaults to using JSON::PP if JSON::XS is not available. That means its behaviour could theoretically change based on which modules you have installed.