java的autotype,关于 fastjson 异常 autoType is not support 问题分析解决
數據倉庫數據抽取服務在不久前增加了 OrientDB 的支持,當時使用了 Orient 官方提供的 JDBC 接口,后來發現 Orient JDBC 真是垃圾到無法言語了,不能滿足我們自動化的 ETL 需求。
后來和 Neo4j 一樣,改用 Http REST API 來請求數據,使用 Jsoup + FastJson 配合來操作數據。
當使用 http://192.190.10.170:2480/listDatabases 來獲取數據庫列表的時候,FastJson 直接報錯了。
后來定位到代碼,JSONObject.parseObject 方法在解析 JSON 字符串的時候拋出異常:
com.alibaba.fastjson.JSONException: autoType is not support. d
at com.alibaba.fastjson.parser.ParserConfig.checkAutoType(ParserConfig.java:889)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:325)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1335)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1301)
at com.alibaba.fastjson.JSON.parse(JSON.java:152)
at com.alibaba.fastjson.JSON.parse(JSON.java:143)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:216)
at com.spinfosec.core.service.nosql.OrientInfoServiceImpl.schemas(OrientInfoServiceImpl.java:112)
at com.spinfosec.service.database.impl.DatabaseServiceImpl.schemas(DatabaseServiceImpl.java:594)
at com.spinfosec.service.database.thrift.DatabaseService$Processor$schemas.getResult(DatabaseService.java:877)
at com.spinfosec.service.database.thrift.DatabaseService$Processor$schemas.getResult(DatabaseService.java:862)
at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:286)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
獲取數據庫列表的代碼:
try
{
String url = this.driver.getUrl() + "/listDatabases";
Document document = Jsoup.connect(url)
.header("Authorization", this.driver.getAuthorization())
.header("Accept", "application/json; charset=UTF-8")
.ignoreContentType(true)
.get();
JSONObject response = JSONObject.parseObject(document.body().text());
JSONArray databases = response.getJSONArray("databases");
databases.toJavaList(String.class)
.stream()
.filter(Objects::nonNull)
.forEach(userDefList::add);
}
catch (Exception e)
{
logger.error("orient list databases error: ", e);
}
從異常日志可以看出,錯誤出在下面的代碼處。
JSONObject response = JSONObject.parseObject(document.body().text());
斷點查看 document.body().text() 返回的 JSON 字符串為:
{
"@type": "d",
"@version": 0,
"databases": [
"ank",
"demo",
"demo1",
"GratefulDeadConcerts",
"LIU"
]
}
“autoType is not support” 錯誤放生在 ParserConfig.checkAutoType 方法中。
根據錯誤堆?;厮?#xff0c;核心錯誤發生在 DefaultJSONParser.java 323行,跟進源碼:
在方法 DefaultJSONParser.parseObject 中,判斷如果 json 的 key 的內容等于 @type,并且并沒有禁用 DisableSpecialKeyDetect 這個關鍵字檢測,則會進行特殊類型反序列化處理,也就是 325 行,在這里 fastjson 自己定義了一個特殊的關鍵字 @type 用于保留反序列化時類型信息,而我們返回的 json 內容中恰好就含有這樣的關鍵字,fastjson 當成了自己的預定義解析類型進行解析,故會報出剛才的錯誤。
根據以上代碼的提示,可以在進行 JSON 解析的時候,將 Feature.DisableSpecialKeyDetect 傳入解析器中,設置禁用關鍵字解析。
JSONObject response = JSONObject.parseObject(document.body().text(), Feature.DisableSpecialKeyDetect);
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的java的autotype,关于 fastjson 异常 autoType is not support 问题分析解决的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菠萝派php示例,菠萝派 - 美食杰 -
- 下一篇: php 模板使用,TMDPHP 模板引擎