2015-08-30 4:57 GMT+02:00 Andrew Dunstan <and...@dunslane.net>:

>
>
> On 08/29/2015 04:27 PM, Tom Lane wrote:
>
>> Jim Nasby <jim.na...@bluetreble.com> writes:
>>
>>> On 8/29/15 12:29 PM, Pavel Stehule wrote:
>>>
>>>> what is correct from JSON perspective? All fields with NULL
>>>>
>>> ISTM that the whole purpose of to_json is to properly jsonify something,
>>> and the proper json form for "undefined" is 'null', is it not?
>>>
>> What's not entirely clear is what we should do with cases like
>>
>> regression=#  select array_to_json(null::int[]);
>>   array_to_json
>> ---------------
>>   (1 row)
>>
>> regression=#  select row_to_json(null::record);
>>   row_to_json
>> -------------
>>   (1 row)
>>
>> If we leave those alone (and in the latter case, in particular, there is
>> not enough information available to do much else) then it's not so clear
>> that changing to_json() is really improving consistency overall.
>> For instance, do we really want row_to_json(null::record) and
>> to_json(null::record) giving different results?  Or if we make them
>> both return "null", that breaks the previous invariant that row_to_json
>> always yields a JSON object.
>>
>> An advantage of leaving these things as strict is that the user can easily
>> substitute whatever specific behavior she wants for NULLs via coalesce(),
>> as was shown upthread.  If we put in a different behavior, then the
>> only way to override it would be with a CASE, which is tedious and creates
>> multiple-evaluation issues.
>>
>> I'm not necessarily against changing it --- but it doesn't seem entirely
>> black-and-white to me, and we do now have a couple of versions worth
>> of precedent we'd be breaking with.
>>
>> If we do vote to change it, I'd want to do so now (ie in 9.5) rather than
>> create yet another year's worth of precedent.
>>
>>
>>
>
> I agree with pretty much all of this. My fairly strong inclination is to
> leave it as it is and document the behaviour more clearly. Changing it
> seems likely to introduce a different inconsistency which is harder to
> understand.
>

I agree so there is not clear solution - and both possible solution can
have a real base. On second hand, the fix with COALESCE, NULLIF, .. is not
hard and it is has not a performance impact - so better documentation can
be good enough fix. The custom solution is ugly named but simple function
to_json2

CREATE OR REPLACE FUNCTION to_json2(anyelement)
RETURNS json AS $$
SELECT COALESCE(to_json($1), json 'null')
$$ LANGUAGE sql;

Regards

Pavel


>
> cheers
>
> andrew
>

Reply via email to