You can use the json_array_elements
function to generate a SETOF json
from an array:
SELECT name, json_array_elements(data) AS author
FROM publisher
Having that, you can use it as a subquery, so you can filter what you want, e.g.:
SELECT DISTINCT author->>'author'
FROM (
SELECT name, json_array_elements(data) AS author
FROM publisher
) t
WHERE t.author->>'type' = 'Novel';
Just note that if you have many rows in this table, the performance of such queries (at least for current version, 9.3) will be really bad. I'd recommend you to normalize the data into tables.