Re: JSON in 9.2 - Could we have just one to_json() function instead of two separate versions ? - Mailing list pgsql-hackers

From Hannu Krosing
Subject Re: JSON in 9.2 - Could we have just one to_json() function instead of two separate versions ?
Date
Msg-id 1335907752.3106.298.camel@hvost
Whole thread Raw
In response to Re: JSON in 9.2 - Could we have just one to_json() function instead of two separate versions ?  (Andrew Dunstan <andrew@dunslane.net>)
Responses Re: JSON in 9.2 - Could we have just one to_json() function instead of two separate versions ?
List pgsql-hackers
On Tue, 2012-05-01 at 09:22 -0700, Andrew Dunstan wrote:
> 
> 
> On Tue, May 1, 2012 at 9:05 AM, Merlin Moncure <mmoncure@gmail.com>
> wrote:
>         On Tue, May 1, 2012 at 10:49 AM, Joey Adams
>         <joeyadams3.14159@gmail.com> wrote:
>         > On Tue, May 1, 2012 at 8:02 AM, Hannu Krosing
>         <hannu@2ndquadrant.com> wrote:
>         >> Hi hackers
>         >>
>         >> After playing around with array_to_json() and row_to_json()
>         functions a
>         >> bit it I have a question - why do we even have 2 variants
>         *_to_json()
>         >
>         > Here's the discussion where that decision was made:
>         >
>         >
>         http://archives.postgresql.org/pgsql-hackers/2012-01/msg01339.php
>         >
>         > To quote:
>         >
>         >>>> why not call all these functions 'to_json' and overload
>         them?
>         >>>
>         >>> I don't honestly feel that advances clarity much. And we
>         might want to overload each at some stage with options that
>         are specific to the datum type. We have various foo_to_xml()
>         functions now.
>         >>
>         >> -1
>         >>
>         >> older proposal is more consistent with xml functions
>         >
>         > The most compelling argument I see here is the one about
>         options
>         > specific to the datum type.
>         
>         
>         I don't find that to be particularly compelling at all.
>          to_timestamp
>         for example supports multiple argument versions depending on
>         the input
>         type.
>         
>         >  * If the JSON type does not yet support, say, converting
>         from a
>         > number, it will be apparent from the names and types of the
>         functions,
>         > rather than being a hidden surprise.  On the other hand,
>         array_to_json
>         > and composite_to_json already convert ANY values to JSON, so
>         this
>         > doesn't matter, anyway.
>         
> 
> 
> I am away from base on a consulting assignment all this week, so my
> connectivity and time are severely limited, and I don't have time to
> respond in depth.
> 
> Let me just point out two things. First, we are approaching a beta
> release. The time for changing this is long since gone, IMNSHO.

First, let me start with stating that I am really happy (and a little
amazed and envious ;) ) with what the current to_json functions are
capable of.

It is already way better than what current query_to_xml could do (at
least int 9.1, may have improved since).


hannu=# select row_to_json(z) from (select 1::int as a, (select s from
(select 2::int as x, 2::text as b)s))z;        row_to_json         
-----------------------------{"a":1,"s":{"x":2,"b":"2"}}
(1 row)

hannu=# select query_to_xml('select 1::int as a, (select s from (select
2::int as x, 2::text as b)s)',true,true,'');                       query_to_xml                         
-------------------------------------------------------------<row
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">+                                                          +
<a>1</a>                                                +  <_x003F_column_x003F_>(2,2)</_x003F_column_x003F_>
+</row>                                                    +
+
(1 row)


The reason I am whining now is that with minor adjustments in
implementation it could all be made much more powerful (try cast
to ::json for values before cast to ::text) and much more elegant thanks
to PostgreSQL's built in casting.

If we allowed json to hold any "JSON value" and tried ::json when
generating json for compound types than we would be able to claim that
PostgreSQL supports JSON everywhere, defaulting to representing
officially unsupported types as strings, but allowing users to convert
these to their preferred conventions.

I'd also prefer to have default conversions already included for some of
our sexier types, like intervals (just a two element array) and hstore
(an object) etc.

Suddenly we would be the best match database for Web development and all
things Ajax and also have a widely used built in and adjustable
interchange format to outer world.

> Second, RFC 4627 is absolutely clear: a valid JSON value can only be
> an object or an array, so this thing about converting arbitrary datum
> values to JSON is a fantasy. 

Probably a typo on your part - valid "JSON _text_" is object or array,
valid "JSON value" can also be number, text, true, false and null

What I am arguing for is interpreting our json type as representing a
"JSON value" not "JSON text", this would enable users to adjust and
extend the generation of json values via defining casts for their
specific types - most notably Date* types but also things like hstore,
which has a natural JSON representation as "object" (a list of key:value
pairs for non-js users, a.k.a. a dictionary, hash, etc.)

> If anything, we should adjust the JSON input routines to disallow
> anything else, rather than start to output what is not valid JSON.

I tested python, ruby and javascript in firefox and chrome, all their
JSON generators generate 1 for standalone integer 1 and "a" for
standalone string a , and none refused to convert either to JSON.

-- 
-------
Hannu Krosing
PostgreSQL Scalability and Performance Consultant
2ndQuadrant Nordic
PG Admin Book: http://www.2ndQuadrant.com/books/



pgsql-hackers by date:

Previous
From: Robert Haas
Date:
Subject: Re: psql omits row count under "\x auto"
Next
From: Alexander Korotkov
Date:
Subject: Re: Patch: add conversion from pg_wchar to multibyte