Rails 3.0 to 3.1 gotcha: Changed ActiveSupport::JSON.backend

by john on October 6, 2011

Ow.

In Rails 3.0, the default ActiveSupport::JSON backend is YAML.

In Rails 3.1, it’s YAJL.

They deserialize JSON times differently. In 3.0 . . .

ruby-1.9.2-p290 :001 > ActiveSupport::JSON.decode( '{"at": "2011-10-13T12:00:00+00:00"}' )
 => {"at"=>2011-10-13 07:00:00 -0500} 

See the lack of quotation marks around what “at” points to? It’s not a String. YAML converts the value to an actual DateTime. (There a DATE_REGEX defined in ActiveSupport::JSON that does the matching.

But in 3.1:

ruby-1.9.2-p290 :001 > ActiveSupport::JSON.decode( '{"at": "2011-10-13T12:00:00+00:00"}' )
 => {"at"=>"2011-10-13T12:00:00+00:00"} 

We had the yajl-ruby gem installed for development, so were getting the the Strings. Then on our staging server, we were getting the already-parsed time value, and were getting errors.

This strikes me as a substantive change. I’m not sure I’d call it a bug, but it was unexpected.

Previous post:

Next post: