Re: JSON serialization in pgAdmin 4

From: Lele Gaifax <lele(at)metapensiero(dot)it>
To: pgadmin-hackers(at)postgresql(dot)org
Subject: Re: JSON serialization in pgAdmin 4
Date: 2016-05-28 17:38:53
Message-ID: 8760tyuloy.fsf@metapensiero.it
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgadmin-hackers

Ashesh Vashi <ashesh(dot)vashi(at)enterprisedb(dot)com> writes:

> On Sat, May 28, 2016 at 7:59 PM, Lele Gaifax <lele(at)metapensiero(dot)it> wrote:
>> I'd like to know if there is already a plan to properly handle
>> date/timestamp
>> fields, that currently fail with an error because simplejson by default
>> does
>> not know how the serialize (or deserialize) those data types.
>
> Can you please share some more detailed information about it, where/in
> which condition it does fail?

Consider the following simple table:

testdb=# \d users
Table "public.users"
Column | Type | Modifiers
-----------+--------------------+------------------------
id | integer | not null
name | character varying |
fullname | character varying |
birthdate | date | not null

testdb=# select * from users;
id | name | fullname | birthdate
----+-------+----------------+------------
1 | jack | Jack Jones | 1987-01-02
2 | wendy | Wendy Williams | 1978-01-02
(2 rows)

Then, executing the "View first 100 rows" action, I get

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <title>500
Internal Server Error</title> <h1>Internal Server Error</h1> <p>The server
encountered an internal error and was unable to complete your
request. Either the server is overloaded or there is an error in the
application.</p>

with the following traceback (slightly edited for brevity)

2016-05-28 19:15:52,824: ERROR pgadmin: Exception on /sqleditor/poll/7927153 [GET]
Traceback (most recent call last):
...
File ".../pgadmin4/web/pgadmin/utils/ajax.py", line 41, in make_json_response
response=json.dumps(doc, cls=DataTypeJSONEncoder),
File ".../python3.6/site-packages/simplejson/__init__.py", line 386, in dumps
**kw).encode(obj)
File ".../python3.6/site-packages/simplejson/encoder.py", line 269, in encode
chunks = self.iterencode(o, _one_shot=True)
File ".../python3.6/site-packages/simplejson/encoder.py", line 348, in iterencode
return _iterencode(o, 0)
File ".../pgadmin4/web/pgadmin/utils/ajax.py", line 26, in default
return json.JSONEncoder.default(self, obj)
File ".../python3.6/site-packages/simplejson/encoder.py", line 246, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: datetime.date(1987, 1, 2) is not JSON serializable

As said, the DataTypeJSONEncoder could be extended to handle dates and times
as well as datetimes and Decimals. BTW, the latter are already supported by
simplejson:

>>> import simplejson
>>> import decimal
>>> d = decimal.Decimal('3.14159')
>>> simplejson.dumps([d])
'[3.14159]'

OTOH, the following is with nssjson:

Python 2.7.11+ (default, May 9 2016, 15:54:33)
[GCC 5.3.1 20160429] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime, uuid
>>> import nssjson
>>> now = datetime.datetime.now()
>>> today = datetime.date.today()
>>> time = now.time()
>>> uid = uuid.uuid1()
>>> nssjson.dumps([uid, now, today, time], iso_datetime=True, handle_uuid=True)
'["2d628922-24f9-11e6-b746-3085a99ccac7", "2016-05-28T19:25:26.109827", "2016-05-28", "19:25:26.109827"]'
>>> nssjson.loads(_, iso_datetime=True, handle_uuid=True)
[UUID('2d628922-24f9-11e6-b746-3085a99ccac7'), datetime.datetime(2016, 5, 28, 19, 25, 26, 109827), datetime.date(2016, 5, 28), datetime.time(19, 25, 26, 109827)]

possibly using its C accelerator to serialize/deserialize those types.

ciao, lele.
--
nickname: Lele Gaifax | Quando vivrò di quello che ho pensato ieri
real: Emanuele Gaifas | comincerò ad aver paura di chi mi copia.
lele(at)metapensiero(dot)it | -- Fortunato Depero, 1929.

In response to

Responses

Browse pgadmin-hackers by date

  From Date Subject
Next Message Ashesh Vashi 2016-05-29 09:50:49 pgAdmin 4 commit: Improvement in the security tab for each of the nodes
Previous Message Ashesh Vashi 2016-05-28 15:29:26 Re: JSON serialization in pgAdmin 4