I had a similar problem with JSON::XS and DBD::Oracle. JSON::XS looks at the scalar and basically does if SvPOKp stringify else if SvNOKp treat as float else if SvIOKp treat as integer.
The problem is that DBD::Oracle does not allow you to bind a column as an integer. The object I wanted to JSONify was very large so all those extra " around integers were adding a lot to the size of the JSON encoded object. To get rid of the " I had to loop through my data and for every integer I had to add 0 to it - this took time. In the end we changed DBD::Oracle to add options to discard the pv.
I documented what we found and did at Support binding of integers in DBD::Oracle so they are returned as IVs