Fix an issue with JSON encoding of "Infinity" and "NaN" values

- When `as_json` returns `Infinity` or `NaN` as the value of any of the key,
  we don't used to call `as_json` on it as it was treated as primitive.
- This used to pass `Infinity` or `NaN` to `JSON.generate` and Ruby used
  to throw an error for `Infinity/NaN not allowed in JSON.`
- This patch changes the code to call `as_json` on these primitives so
  that they are converted to proper values before being passed to
  `JSON.generate`.
- Fixes #26877.
上级 fe1f4b2a
......@@ -84,7 +84,7 @@ def jsonify(value)
when String
EscapedString.new(value)
when Numeric, NilClass, TrueClass, FalseClass
value
value.as_json
when Hash
Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }]
when Array
......
......@@ -432,6 +432,28 @@ def test_exception_to_json
assert_equal '"foo"', ActiveSupport::JSON.encode(exception)
end
class InfiniteNumber
def as_json(options = nil)
{ "number" => 1.0 / 0 }
end
end
def test_to_json_works_when_as_json_returns_infinite_number
expected = { number: nil }.to_json
assert_equal expected, InfiniteNumber.new.to_json
end
class NaNNumber
def as_json(options = nil)
{ "number" => 0.0 / 0 }
end
end
def test_to_json_works_when_as_json_returns_NaN_number
expected = { number: nil }.to_json
assert_equal expected, NaNNumber.new.to_json
end
protected
def object_keys(json_object)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册