Table B-6 "Use of ResultSet getter Methods to Retrieve JDBC Data Types" in jdbc 3(&4) spec shows what datatypes support getString(), and Array and Struct are not one of those. Ie, we have leeway here. There is also not much pattern to be followed here, as we don't have many databases supporting these types (eq mysql and sql server don't).
I think having json strings is useful for being able to parse the strings back to types.
btw, the current jdbc driver implementation returns strings for the complex types, if you do a ResultSetMetadata.getColumnType(int) on column that is actually of hive map/struct/array type, it returns the String type .
Ideally, we should add support for returning real array and struct types. I am not sure how map type should be handled, maybe json string would remain the workaround.