diff --git a/datasette/views/base.py b/datasette/views/base.py index 90aed924..6c69c538 100644 --- a/datasette/views/base.py +++ b/datasette/views/base.py @@ -185,7 +185,9 @@ class BaseView(RenderMixin): # Deal with the _shape option shape = request.args.get("_shape", "arrays") - if shape in ("objects", "object", "array"): + if shape == "arrayfirst": + data = [row[0] for row in data["rows"]] + elif shape in ("objects", "object", "array"): columns = data.get("columns") rows = data.get("rows") if rows and columns: diff --git a/docs/json_api.rst b/docs/json_api.rst index c69eb9cc..4164cc20 100644 --- a/docs/json_api.rst +++ b/docs/json_api.rst @@ -62,6 +62,7 @@ options: * ``?_shape=arrays`` - ``"rows"`` is the default option, shown above * ``?_shape=objects`` - ``"rows"`` is a list of JSON key/value objects * ``?_shape=array`` - the entire response is an array of objects +* ``?_shape=arrayfirst`` - the entire response is a flat JSON array containing just the first value from each row * ``?_shape=object`` - the entire response is a JSON object keyed using the primary keys of the rows ``objects`` looks like this:: @@ -102,6 +103,10 @@ options: } ] +``arrayfirst`` looks like this:: + + [1, 2, 3] + ``object`` looks like this:: { diff --git a/tests/test_api.py b/tests/test_api.py index 051a7fdc..1ec50b09 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -433,6 +433,17 @@ def test_table_shape_arrays(app_client): ] == response.json['rows'] +def test_table_shape_arrayfirst(app_client): + response = app_client.get( + '/test_tables.json?' + urllib.parse.urlencode({ + 'sql': 'select content from simple_primary_key order by id', + '_shape': 'arrayfirst' + }), + gather_request=False + ) + assert ['hello', 'world', ''] == response.json + + def test_table_shape_objects(app_client): response = app_client.get( '/test_tables/simple_primary_key.json?_shape=objects',