標準化/結構化 JSON 輸出
在構建一個基於JSON的API的時候, 往往我們還會需要新增一些額外的欄位, 形成類似於 資料主體/額外資訊 結構的資料, 如:
{
"mainContent": { // 資料主體
"name": "小明",
"age": 11
},
"external": { // 額外資訊
"errorMsg": "OK",
"errorCode": "0"
}
}
方法1 建一個帶泛型的 pojo , 將資料塞進去, 然後JSON化輸出
這樣的類可以是:
public class BizDto<T> {
public BizDto() {
// 為了方便, 設定預設值
External external = new External();
external.setErrorCode("0");
external.setErrorMsg("OK");
}
private T mainContent;
private External external;
public T getMainContent() {
return mainContent;
}
public void setMainContent(T mainContent) {
this.mainContent = mainContent;
}
public External getExternal() {
return external;
}
public void setExternal(External external) {
this.external = external;
}
public class External{
private String errorMsg;
private String errorCode;
public String getErrorMsg() {
return errorMsg;
}
public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}
public String getErrorCode() {
return errorCode;
}
public void setErrorCode(String errorCode) {
this.errorCode = errorCode;
}
}
}
然後所有的 restfull api 都用這個 pojo 封裝一下再輸出
方法2 干預 spring json 序列化的過程
使用這個辦法的好處是 controller 方法的返回值不需要做任何改變, 可以直接輸出資料主體
先自定義HttpMessageConverter
來實現自定義的 java轉換過程 (from java/ to java)
然後呢 通過覆蓋 spring 預設的 HttpMessageConverters, 或者將自己的 converter 加上去, 辦法是宣告一個 bean
@Bean
public HttpMessageConverters additionalConverters() {
return new HttpMessageConverters(new TheCustomConverter());
}
HttpMessageConverters 有3個構造方法
HttpMessageConverters(HttpMessageConverter<?>... additionalConverters)
HttpMessageConverters(Collection<HttpMessageConverter<?>> additionalConverters)
HttpMessageConverters(boolean addDefaultConverters, Collection<HttpMessageConverter<?>> converters)
前兩個是給spring 預設處理列表中新增一個新的 converter, 第三個是覆蓋掉預設的 converters, 只使用自己定義的
使用這個方法還需要考慮一種情況, 就是出錯了, 要怎麼輸出錯誤資訊到前端
思路是使用@ControllerAdvice
+ 自定義 runtime Exception
遇到錯誤, 直接 throw new CustomeRuntimeException("errorcode","errormsg", ex)
交給框架去處理
小尾巴:
既然 spring 預設帶了 jackson 作為 json 的序列化工具, 有沒有人想過直接使用這個工具來序列化java物件呢, 多數時候我們都是再用一個第三方jar包比如著名的 fastJSON. 但再新增一個第三方工具帶來的麻煩是 json 序列化時配置的不統一了
比如說 jackson 預設會將 Date 物件格式化成 utc 格式, 而fastJson會將日期輸出成 毫秒 時間戳
有一個全域性統一的配置, 可以避免在輸出時每次都控制一下格式化, 而且很容易遺漏
辦法就是, 注入 jackson 的ObjectMapper
@Autowired
private ObjectMapper objectMapper; // 注入
// 輸出JSON字串
objectMapper.writer().writeValueAsString(javaObj));
// 將JSON字串轉成java bean;
objectMapper.readValue(jsonStr,javaObj.class);
Map<String, Object> map = new HashMap<String, Object>();
// JSON string to Map
map = objectMapper.readValue(json, new TypeReference<Map<String, String>>(){});
相關文章
- Linux的標準輸入、標準輸出和標準錯誤Linux
- Java —— 標準輸入輸出Java
- python 標準輸入輸出Python
- Python常用標準庫(pickle序列化和JSON序列化)PythonJSON
- Spring AI 更新:支援OpenAI的結構化輸出,增強對JSON響應的支援SpringOpenAIJSON
- converter設計模式擴充套件,多種輸入輸出與標準輸入輸出的轉化方案設計模式套件
- laravel-api-response - 規範化和標準化 Laravel API 響應資料結構LaravelAPI資料結構
- Golang操作結構體、Map轉化為JSONGolang結構體JSON
- go基於grpc構建微服務框架-結構化日誌輸出GoRPC微服務框架
- Html 結構標準模板HTML
- Git Commit 標準化GitMIT
- 結構化與非結構化
- 指令碼日誌的標準輸出指令碼
- weblogic JDBC標準化效能最佳化WebJDBC
- 如何用 Linux 命令列工具解析和格式化輸出 JSONLinux命令列JSON
- pydantic+openai+json: 控制大模型輸出的最佳正規化OpenAIJSON大模型
- 架構師需要懂的環境配置標準化架構
- KubeVela:標準化的雲原生平臺構建引擎
- 《儲存產業標準化白皮書(2022)》釋出產業
- 格式化輸入輸出
- C++名稱空間、標準輸入輸出、引用C++
- 如何輸出結構體結構體
- 格式化輸出
- weblogic標準化部署大綱Web
- Clang-format格式標準化ORM
- 什麼是特徵標準化特徵
- 使用Java處理JSON結構化資料 -Advanced Web MachineryJavaJSONWebMac
- 結構化資料、半結構化資料和非結構化資料
- 全新標準OpenXR出臺,VRAR行業“碎片化”亂象總算要終結了VR行業
- 資料變換-歸一化與標準化
- 特徵預處理之歸一化&標準化特徵
- 格式化輸入和輸出
- JDK 18 及以上使用標準輸出流中文輸出亂碼問題JDK
- linux自動清理Docker標準輸出日誌LinuxDocker
- PLC結構化文字(ST)——特殊指標(This&Super)指標
- 如何利用NLog輸出結構化日誌,並在Kibana優雅分析日誌?
- 標準庫~JSON物件詳解JSON物件
- pythonformat格式化輸出PythonORM