will / crystal-pg

a postgres driver for crystal
BSD 3-Clause "New" or "Revised" License
462 stars 77 forks source link

Json columns are read as JSON::PullParser instead of JSON::Any #232

Closed matthewmcgarvey closed 3 years ago

matthewmcgarvey commented 3 years ago

Fixes #125

Currently, if you have a json column and read it with this library, it is automatically turned into a JSON::Any. It makes sense when you don't care about the structure, but there's two problems with doing that:

  1. JSON::Any is immutable so that values cannot be changed and then saved back to the database
  2. You cannot convert a JSON::Any into a JSON::Serializable

This PR changes the default deserialization of json columns from JSON::Any to JSON::PullParser. The benefit we get from this is that it can easily be converted into a JSON::Any or a JSON::Serializable. It is still not mutable but it's easier to get to a mutable setting:

properties = result_set.read(JSON::PullParser)
mutable_properties = Hash(String, String).new(properties)

I added a method specifically for still supporting calling result_set.read(JSON::Any) with hopes that will cause the least amount of breakage, because this is definitely a breaking change.

will commented 3 years ago

Thanks! Could you please add a line to the changelog file about this?

will commented 3 years ago

Awesome, thanks!