From 7b53d1372df4bbc7a539b5e493ff1491ec460397 Mon Sep 17 00:00:00 2001 From: Sebi Burkhard Date: Mon, 15 Aug 2011 16:54:13 +0700 Subject: [PATCH] JSON: Encode infinite or NaN floats as null to generate valid JSON. --- activesupport/lib/active_support/json/encoding.rb | 4 ++++ activesupport/test/json/encoding_test.rb | 3 +++ 2 files changed, 7 insertions(+) diff --git a/activesupport/lib/active_support/json/encoding.rb b/activesupport/lib/active_support/json/encoding.rb index 67698c1cff..a7a09d5bbe 100644 --- a/activesupport/lib/active_support/json/encoding.rb +++ b/activesupport/lib/active_support/json/encoding.rb @@ -186,6 +186,10 @@ def as_json(options = nil) self end #:nodoc: def encode_json(encoder) to_s end #:nodoc: end +class Float + def as_json(options = nil) finite? ? self : NilClass::AS_JSON end #:nodoc: +end + class BigDecimal # A BigDecimal would be naturally represented as a JSON number. Most libraries, # however, parse non-integer JSON numbers directly as floats. Clients using diff --git a/activesupport/test/json/encoding_test.rb b/activesupport/test/json/encoding_test.rb index 8cf1a54a99..018207853f 100644 --- a/activesupport/test/json/encoding_test.rb +++ b/activesupport/test/json/encoding_test.rb @@ -27,6 +27,9 @@ def as_json(options) NilTests = [[ nil, %(null) ]] NumericTests = [[ 1, %(1) ], [ 2.5, %(2.5) ], + [ 0.0/0.0, %(null) ], + [ 1.0/0.0, %(null) ], + [ -1.0/0.0, %(null) ], [ BigDecimal('2.5'), %("#{BigDecimal('2.5').to_s}") ]] StringTests = [[ 'this is the ', %("this is the \\u003Cstring\\u003E")],