For what it's worth, I've finally had an epiphany and wrote following small function that can be used for this and that I think is quite in line with dbplyr philosophy:
json_field <- function(json_column, json_field = NULL, class = NULL){
json_column <- rlang::sym(json_column)
rlang::quo(cast(!!json_column %->>% !!json_field %as% !!dbplyr::sql(class)))
}
I use it together with pmap/map2 to create a named list that you can splice into mutate call, so something like this:
quos <- pmap(mapping, json_field, "json_column") %>%
set_names(mapping[["desired_names"]])
tbl %>%
mutate(!!!quos)
It's more of a pseudo-code at this point, but hopefully provides enough guidance to replicate if anyone needs this.