sql/mozfun/json/from_map_json/udf.sql (28 lines of code) (raw):

CREATE OR REPLACE FUNCTION json.from_map_json(input JSON) RETURNS JSON LANGUAGE js AS """ if (input && input.length) { return input.reduce((acc, {key, value}) => { let parsed; try { parsed = JSON.parse(value); } catch (err) { parsed = value; } acc[key] = parsed; return acc; }, {}); } return null; """; -- Tests SELECT assert.null(json.from_map_json(NULL)), assert.null(json.from_map_json(JSON '[]')), assert.json_equals( JSON '{"foo": {"nested": 1}}', json.from_map_json(JSON '[{"key": "foo", "value": {"nested": 1}}]') ), assert.equals(TRUE, BOOL(json.from_map_json(JSON '[{"key": "foo", "value": "true"}]').foo)), assert.equals(123, INT64(json.from_map_json(JSON '[{"key": "foo", "value": "123"}]').foo))