現(xiàn)在最常見的數(shù)據(jù)交換格式是 JSON。
實(shí)際上,Controller 注解中的默認(rèn)值指定 Micronaut 中的控制器默認(rèn)使用和生成 JSON。
為了以非阻塞方式執(zhí)行此操作,Micronaut 構(gòu)建在 Jackson 異步 JSON 解析 API 和 Netty 之上,以便以非阻塞方式讀取傳入的 JSON。
使用 Reactive Frameworks 綁定
然而,從開發(fā)人員的角度來看,您通??梢灾皇褂闷胀ㄅf式 Java 對象 (POJO),并且可以選擇使用 Reactive 框架,例如 RxJava 或 Project Reactor。下面是一個(gè)控制器的例子,它以非阻塞的方式從 JSON 中讀取并保存?zhèn)魅氲?nbsp;POJO:
使用 Reactive Streams 讀取 JSON
Java | Groovy | Kotlin |
|
|
|
該方法接收一個(gè)發(fā)布者,一旦讀取 JSON,該發(fā)布者就會發(fā)出 POJO
map 方法將實(shí)例存儲在 Map 中
返回一個(gè) HttpResponse
從命令行使用 cURL,您可以將 JSON POST 到 /people URI:
使用 cURL POST JSON
$ curl -X POST localhost:8080/people -d '{"firstName":"Fred","lastName":"Flintstone","age":45}'
使用 CompletableFuture 綁定
與前面示例相同的方法也可以改用 CompletableFuture API 編寫:
使用 CompletableFuture 讀取 JSON
Java | Groovy | Kotlin |
|
|
|
上面的例子使用thenApply方法實(shí)現(xiàn)的和前面的例子一樣。
使用 POJO 進(jìn)行綁定
但是請注意,您可以輕松地編寫:
綁定 JSON POJO
Java | Groovy | Kotlin |
|
|
|
只有在以非阻塞方式讀取數(shù)據(jù)后,Micronaut 才會執(zhí)行您的方法。
Jackson 產(chǎn)生的輸出可以通過多種方式定制,從定義 Jackson 模塊到使用 Jackson 注釋
可以通過使用 JacksonConfiguration 類進(jìn)行配置來配置 Jackson ObjectMapper。
所有 Jackson 配置鍵都以 jackson 開頭。
dateFormat |
String |
日期格式 |
locale |
String |
使用 Locale.forLanguageTag。例子: |
timeZone |
String |
使用 TimeZone.getTimeZone。例子: |
serializationInclusion |
String |
JsonInclude.Include 之一。例子: |
propertyNamingStrategy |
String |
PropertyNamingStrategy 實(shí)例的名稱。例子: |
defaultTyping |
String |
用于枚舉 ObjectMapper.DefaultTyping 的多態(tài)類型處理的全局 defaultTyping。例子: |
示例:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
所有功能都可以配置為它們的名稱作為鍵和一個(gè)布爾值來指示啟用或禁用。
serialization |
Map |
|
deserialization |
Map |
|
mapper |
Map |
|
parser |
Map |
|
generator |
Map |
|
factory |
Map |
示例:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
進(jìn)一步自定義 JsonFactory
在某些情況下,您可能希望在功能配置之外自定義 ObjectMapper 使用的 JsonFactory(例如,允許自定義字符轉(zhuǎn)義)。這可以通過提供您自己的 JsonFactory bean 或通過提供在啟動時(shí)配置默認(rèn) bean 的 BeanCreatedEventListener<JsonFactory> 來實(shí)現(xiàn)。
支持@JsonView
如果在配置文件(例如 application.yml)中將 jackson.json-view.enabled 設(shè)置為 true,則可以在控制器方法上使用 @JsonView 注釋。
Jackson 的 @JsonView 注釋允許您控制在每個(gè)響應(yīng)的基礎(chǔ)上公開哪些屬性。
除了配置之外,還可以注冊 bean 來自定義 Jackson。擴(kuò)展以下任何類的所有 bean 都在對象映射器中注冊:
服務(wù)加載器
通過服務(wù)加載器注冊的任何模塊也將添加到默認(rèn)對象映射器。
數(shù)字精度
在 JSON 解析期間,框架可能會將任何傳入數(shù)據(jù)轉(zhuǎn)換為中間對象模型。默認(rèn)情況下,此模型使用 BigInteger、long 和 double 作為數(shù)值。這意味著可能會丟失一些可以由 BigDecimal 表示的信息。例如,即使反序列化的目標(biāo)類型使用 BigDecimal,也可能會截?cái)嗖荒苡?nbsp;double 表示的具有許多小數(shù)位的數(shù)字。關(guān)于尾隨零數(shù)的元數(shù)據(jù) (BigDecimal.precision()),例如0.12 和 0.120 之間的差異也被丟棄。
如果您需要數(shù)字類型的完全準(zhǔn)確性,請使用以下配置:
Properties | Yaml | Toml | Groovy | Hocon | JSON |
|
|
|
|
|
|
更多建議: