<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## 一、 FastJSON、Gson和Jackson對比 **開源的Jackson**:SpringBoot默認是使用Jackson作為JSON數據格式處理的類庫,Jackson在各方面都比較優秀,所以不建議將Jackson替換為Gson或fastjson。 **Google的Gson**:Gson是Google為滿足內部需求開發的JSON數據處理類庫,其核心結構非常簡單,toJson與fromJson兩個轉換函數實現對象與JSON數據的轉換, **阿里巴巴的FastJson**:Fastjson是阿里巴巴開源的JSON數據處理類庫,其主要特點是序列化速度快。當并發數據量越大的時候,越能體現出fastjson的優勢。但是筆者覺得選擇JSON處理類庫,快并不是唯一需要考慮的因素,與數據庫或磁盤IO相比,JSON數據序列化與反序列化的這點時間還不足以對軟件性能產生比較大的影響。 **性能比較**:筆者看多很多的關于這三個類庫的性能測試(截止2019年11月20日),總結如下: * 序列化過程性能:fastjson >= jackson > Gson,Gson在數據并發量較大時會與其他二者有較明顯差距。 * 反序列化性能:三者幾乎不相上下,Gson略好一點。 **fastjson為人詬病的問題:**:雖然fastjson速度上有一定的優勢,但是其為了追求速度,很大程度放棄了JSON的規范性。因此還時不時的在有些版本中暴露安全問題。大家如果有機會去看一下fastjson的github代碼,其代碼質量不是很高。所以用不用fastjson在國內軟件界還是有爭議的,在國外基本沒人用。 ## 二、在Spring中注解方法使用Jackson 在上文中,筆者已經給出自己的結論:不建議將Jackson替換為Gson或fastjson。jackson主要的作用是: > 什么叫序列化與反序列化?說白了就是把對象轉成可傳輸、可存儲的格式(json、xml、二進制、甚至自定義格式)叫做序列化。反序列化顧名思義。 * 反序列化:在客戶端將請求數據上傳到服務端的時候,自動的處理JSON數據對象中的字符串、數字,將其轉換為包含Date類型、Integer等類型的對象。 * 序列化:按照指定的格式、順序等將實體類對象轉換為JSON字符串 所以我們下面就給大家介紹一下jackson的常用注解的使用方法,幫助我們進行序列化和反序列化工作。 ### 常用注解 這些注解通常用于標注java實體類或實體類的屬性。 * @JsonPropertyOrder(value={"pname1","pname2"}) 改變子屬性在JSON序列化中的默認定義的順序。如:param1在先,param2在后。 * @JsonIgnore 排除某個屬性不做序列化與反序列化 * @JsonProperty(anotherName) 為某個屬性換一個名稱,體現在JSON數據里面 * @JsonInclude(JsonInclude.Include.NON\_NULL) 排除為空的元素不做序列化反序列化 * @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 指定日期類型的屬性格式 ~~~ @JsonPropertyOrder(value={"content","title"}) public class Article { @JsonIgnore private Long id; @JsonProperty("auther") private String author; private String title; private String content; @JsonInclude(JsonInclude.Include.NON_NULL) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; private List<Reader> reader; } ~~~ 上文代碼中對應的JSON數據格式可以為: ~~~ { auther :"", content:"", title:"", createTime:"2019-10-20 12:12:12", reader:[{"name":"zimug","age":18},{"name":"kobe","age":37}] } ~~~ * 因為定義了JsonPropertyOrder,content在先,title在后 * 因為定義了JsonIgnore,id屬性被忽略 * 因為定義了JsonProperty,author屬性變為auther * 因為定義了JsonInclude和JsonFormat,createTime不要為空,并且格式為 "yyyy-MM-dd HH:mm:ss" 通常會對日期類型轉換,進行全局配置,而不是在每一個java bean里面配置 ~~~ spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 ~~~ ## 三、手動數據轉換 除了在spring框架內實現自動的前后端JSON數據與java對象的轉換,我們還可以使用jackson自己寫代碼進行轉換。 ~~~ //jackson的ObjectMapper 轉換對象 ObjectMapper mapper = new ObjectMapper(); //將某個java對象轉換為JSON字符串 String jsonStr = mapper.writeValueAsString(javaObj); //將jsonStr轉換為Ademo類的對象 Ademo ademo = mapper.readValue(jsonStr, Ademo.class); ~~~ 當JSON字符串代表的對象的字段多于類定義的字段時,使用readValue會拋出UnrecognizedPropertyException異常,在類的定義處加上@JsonIgnoreProperties(ignoreUnknown = true)可以解決這個問題。 ## 四、Postman測試 下面讓我們結合postman對REST接口和Jackson做一下測試吧。Postman是接口測試過程中經常使用到的工具。 測試使用數據: ~~~ { "id": 1, "author": "zimug", "title": "手摸手教你開發spring boot", "content": "c", "createTime": "", "reader":[{"name":"zimug","age":18},{"name":"kobe","age":37}] } ~~~ 下面以測試新增文章的接口為例: * 測試的接口服務端點為“/rest/article” * 服務端點支持的HTTP方法為POST * 使用Http協議的body傳輸JSON數據,對應Controller應該使用RequestBody進行數據參數接收 * 點擊Send進行接口數據的發送 測試的接口代碼請參考本專欄之前實現的RESTful接口,更多接口測試請看課堂視頻實操。 ![](https://img.kancloud.cn/f2/41/f241191f583aa6487220bab353f2dfc2_816x445.png) ## 五、神奇的Bug 在有些版本JsonFormat注解(比如:Spring Boot 2.3.0.RELEASE),不能生效。我經過反復的實驗,為實體類增加一個無參的構造函數和一個全參的構造函數,JsonFormat注解就生效了! ![](https://img.kancloud.cn/57/3e/573ec4232cb3f97de314f9c956d170ba_1166x376.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看