數(shù)據(jù)庫的幾個字段使用到Json類型,持久層用的是Mybatis,由于沒辦法實現(xiàn)自動轉(zhuǎn)換,因此需要自己寫幾個handler。
因為json類型的字段用到的地方比較多,也不想一個一個的去寫handler,所以在代碼里使用對象的話就用Map,數(shù)組就使用List。
實體
data class Entity(
@UDJdbcType(typeHandler = JsonListMapHandler::class)
val list: List<Map<String, Any>>? = null,
@UDJdbcType(typeHandler = JsonMapHandler::class)
val obj: HashMap<String, Any>? = null,
)
@UDJdbcType是我們自己實現(xiàn)的動態(tài)生成sql的注解。
對應兩個字段,我們寫了兩個HandlerJsonListMapHandler、JsonMapHandler。
@MappedTypes(List::class)
@MappedJdbcTypes(JdbcType.VARCHAR)
class JsonListMapHandler : BaseTypeHandler<List<Map<*, *>>>() {
\\ 此處省略
}
@MappedTypes(HashMap::class)
@MappedJdbcTypes(JdbcType.VARCHAR)
class JsonMapHandler: BaseTypeHandler<HashMap<*, *>>() {
\\ 此處省略
}
一開始list這個字段,我們使用的也是HashMap,數(shù)據(jù)庫寫操作是正常的,但調(diào)用接口讀取數(shù)據(jù)時就一直報以下錯誤,就是Gson轉(zhuǎn)換不成功。原因是遇到HashMap時會跑到JsonMapHandler里進行轉(zhuǎn)換。因為類型不對,所以轉(zhuǎn)換失敗。把第一個字段屬性List<HashMap<*, *>>改成List<Map<*, *>>,JsonListMapHandler里也使用Map,問題解決。
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2