CREATE EXTENSION jsonb_plpython3u CASCADE; NOTICE: installing required extension "plpython3u" -- test jsonb -> python dict CREATE FUNCTION test1(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) assert(val == {'a': 1, 'c': 'NULL'}) return len(val) $$; SELECT test1('{"a": 1, "c": "NULL"}'::jsonb); test1 ------- 2 (1 row) -- test jsonb -> python dict -- complex dict with dicts as value CREATE FUNCTION test1complex(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) assert(val == {"d": {"d": 1}}) return len(val) $$; SELECT test1complex('{"d": {"d": 1}}'::jsonb); test1complex -------------- 1 (1 row) -- test jsonb[] -> python dict -- dict with array as value CREATE FUNCTION test1arr(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, dict) assert(val == {"d": [12, 1]}) return len(val) $$; SELECT test1arr('{"d":[12, 1]}'::jsonb); test1arr ---------- 1 (1 row) -- test jsonb[] -> python list -- simple list CREATE FUNCTION test2arr(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, list) assert(val == [12, 1]) return len(val) $$; SELECT test2arr('[12, 1]'::jsonb); test2arr ---------- 2 (1 row) -- test jsonb[] -> python list -- array of dicts CREATE FUNCTION test3arr(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert isinstance(val, list) assert(val == [{"a": 1,"b": 2}, {"c": 3,"d": 4}]) return len(val) $$; SELECT test3arr('[{"a": 1, "b": 2}, {"c": 3,"d": 4}]'::jsonb); test3arr ---------- 2 (1 row) -- test jsonb int -> python int CREATE FUNCTION test1int(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == 1) return val $$; SELECT test1int('1'::jsonb); test1int ---------- 1 (1 row) -- test jsonb string -> python string CREATE FUNCTION test1string(val jsonb) RETURNS text LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == "a") return val $$; SELECT test1string('"a"'::jsonb); test1string ------------- a (1 row) -- test jsonb null -> python None CREATE FUNCTION test1null(val jsonb) RETURNS int LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ assert(val == None) return 1 $$; SELECT test1null('null'::jsonb); test1null ----------- 1 (1 row) -- test python -> jsonb CREATE FUNCTION roundtrip(val jsonb) RETURNS jsonb LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb as $$ return val $$; SELECT roundtrip('null'::jsonb); roundtrip ----------- (1 row) SELECT roundtrip('1'::jsonb); roundtrip ----------- 1 (1 row) SELECT roundtrip('1234567890.0987654321'::jsonb); roundtrip ----------------------- 1234567890.0987654321 (1 row) SELECT roundtrip('-1234567890.0987654321'::jsonb); roundtrip ------------------------ -1234567890.0987654321 (1 row) SELECT roundtrip('true'::jsonb); roundtrip ----------- true (1 row) SELECT roundtrip('"string"'::jsonb); roundtrip ----------- "string" (1 row) SELECT roundtrip('{"1": null}'::jsonb); roundtrip ------------- {"1": null} (1 row) SELECT roundtrip('{"1": 1}'::jsonb); roundtrip ----------- {"1": 1} (1 row) SELECT roundtrip('{"1": true}'::jsonb); roundtrip ------------- {"1": true} (1 row) SELECT roundtrip('{"1": "string"}'::jsonb); roundtrip ----------------- {"1": "string"} (1 row) SELECT roundtrip('[null]'::jsonb); roundtrip ----------- [null] (1 row) SELECT roundtrip('[1]'::jsonb); roundtrip ----------- [1] (1 row) SELECT roundtrip('[true]'::jsonb); roundtrip ----------- [true] (1 row) SELECT roundtrip('["string"]'::jsonb); roundtrip ------------ ["string"] (1 row) SELECT roundtrip('[null, 1]'::jsonb); roundtrip ----------- [null, 1] (1 row) SELECT roundtrip('[1, true]'::jsonb); roundtrip ----------- [1, true] (1 row) SELECT roundtrip('[true, "string"]'::jsonb); roundtrip ------------------ [true, "string"] (1 row) SELECT roundtrip('["string", "string2"]'::jsonb); roundtrip ----------------------- ["string", "string2"] (1 row) -- complex numbers -> jsonb CREATE FUNCTION testComplexNumbers() RETURNS jsonb LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = 1 + 2j return x $$; SELECT testComplexNumbers(); ERROR: could not convert value "(1+2j)" to jsonb CONTEXT: while creating return value PL/Python function "testcomplexnumbers" -- range -> jsonb CREATE FUNCTION testRange() RETURNS jsonb LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = range(3) return x $$; SELECT testRange(); testrange ----------- [0, 1, 2] (1 row) -- 0xff -> jsonb CREATE FUNCTION testDecimal() RETURNS jsonb LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = 0xff return x $$; SELECT testDecimal(); testdecimal ------------- 255 (1 row) -- tuple -> jsonb CREATE FUNCTION testTuple() RETURNS jsonb LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = (1, 'String', None) return x $$; SELECT testTuple(); testtuple --------------------- [1, "String", null] (1 row) -- interesting dict -> jsonb CREATE FUNCTION test_dict1() RETURNS jsonb LANGUAGE plpython3u TRANSFORM FOR TYPE jsonb AS $$ x = {"a": 1, None: 2, 33: 3} return x $$; SELECT test_dict1(); test_dict1 -------------------------- {"": 2, "a": 1, "33": 3} (1 row)