Re: Postgresql 9.4 / JSONB / JDBC - Mailing list pgsql-jdbc

From Mo Omer
Subject Re: Postgresql 9.4 / JSONB / JDBC
Date
Msg-id 028E3284-7B6B-4BC5-A6F2-757BDF02E7DF@gmail.com
Whole thread Raw
In response to Re: Postgresql 9.4 / JSONB / JDBC  (Christopher BROWN <brown@reflexe.fr>)
List pgsql-jdbc
Morning all,

I've been using JSONb pretty extensively for about 2 weeks now in a pre-pro setup.

It's advisable to not only think very hard before both of the below requests, but to probably make them easy to disable. I recall there was a request to do the same serialization for JSON (mayhap it was a question about JSONb, about serializing on the other end, though) which was answered with a swift rejection.

I'm pretty wary about conversions here, because if the strings I send through aren't matching up with the java bytes that actually go in, that can be a massive PITA.

However, what would be welcome is an (optional) escape method for JSON in general.

After inserting ~100MM rows with COPY/JSONB, it sure would be great to optionally invoke a jdbc string escape method rather than substituting/escaping them all myself. The existing built-in methods don't fit the requirements of COPY. And, COPY with JSONb has further unique requirements (I.e not escaping the quotes around keys and values more than language default of one slash, yet escaping internal chars further - or removing them)

E.g.

{"hello": "\tthere, \"John\""} needs to have a few extra slashes present in order to be valid. Would be nice to have a solid escape method for this.

Thank you for all the hard work JDBC maintainers,

Mo

This message was drafted on a tiny touch screen; please forgive brevity & tpyos

On Dec 20, 2014, at 8:14 AM, Christopher BROWN <brown@reflexe.fr> wrote:

Dave,

I've only just started looking at how JSONB works in Postgresql, and am mainly basing ideas on what I can see here:

I suppose the basic requirement would be to be able to do stuff like this in JDBC:

PreparedStatement stmt = connection.prepareStatement("UPDATE MYTABLE SET MYJSONCOL = ? WHERE MYID = ?");
stmt.setObject(1, map);
stmt.setInt(2, 123);

...as opposed to something like this (with a potentially large and variable number of "?" markers):

prepareStatement("UPDATE MYTABLE SET MYJSONCOL = '{\"?\":?, \"?\": {\"?\":?}}' WHERE MYID = ?");

...or just creating a normal statement and rolling my own escaping to prevent SQL injection.

It would make sense to only allow keys of strings, and values of either Map, Collection, Iterable, Stream, array, string, number, boolean, or null (although I'm a bit confused about the latter after consulting table 8-23 from the linked documentation above).

That would be the first requirement.

The second would be an optimisation to avoid having to convert existing data structures but might need to be "a capability that you can add" rather than "built in".  For example, I use the Jackson JSON API (there are others of course) and I wouldn't expect it to be bundled into the driver, however it'd be useful to pass a JSONNode object into "stmt.setObject" and have a way of telling the driver how to serialize it (I don't know if the getObject method of a resultset can be forced to use Map or something else).  Jackson has useful serialization methods of course, so I could just write a string suffixed with "::json", but I'm guessing maybe the driver provides some sort of optimized binary representation which could be used for better performance.

Thanks,
Christopher


On 20 December 2014 at 13:19, Dave Cramer <pg@fastcrypt.com> wrote:
Christopher,

No you have not missed anything, there has been nothing done with jsonb and the driver. Since you are the first, perhaps you can give me your wish list ?

What would you like to see happen ?

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca

On 20 December 2014 at 04:44, Christopher BROWN <brown@reflexe.fr> wrote:
Hello,

I'm new to this list, and have tried searching both the mailing list archives, and internet in general, for information on how to use the new JSONB data type with JDBC.  Found almost nothing in the mailing list archives, and internet searches "helpfully" assume I've misspelled "json" and give me results that are unrelated or refer to the basic "JSON" type from older Postgresql versions.

How can this type be used, with simple "flat" key-value collections (maps), with tree-like maps-of-maps, and (ideally) with JSON APIs such as Jackson JSON API?

Is it possible?  Is it already described somewhere that I missed?

Thanks,
Christopher

pgsql-jdbc by date:

Previous
From: Christopher BROWN
Date:
Subject: Re: Postgresql 9.4 / JSONB / JDBC
Next
From: Alexis Meneses
Date:
Subject: Re: Postgresql 9.4 / JSONB / JDBC