1. 程式人生 > >springMVC利用FastJson介面返回json的配置

springMVC利用FastJson介面返回json的配置

分享知識 傳遞快樂


新增Fastjson的包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.46</version>
</dependency>

springmvc整合fastjson

    <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <!-- 配置Fastjson支援 -->
            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>QuoteFieldNames</value>
                    </list>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

fastjson與SpringMVC整合


(1)若按照jackson和SpringMVC的整合方式,應按照下面的寫法,但測試發現這樣會報告"HTTP Status 406"
The resource identified by this request is only capable of generating responses
with characteristics not acceptable according to the request "accept" headers.

(2)測試通過的整合方式為上面那樣在mvc:annotation-driven裡面進行註冊

(3)supportedMediaTypes增加[text/html;charset=UTF-8]值,是為了相容IE6
否則[application/json]值在IE6中會導致彈出對話方塊詢問是否儲存檔案,而firefox等高階瀏覽器會正常列印json字串

(4)若像下面這樣給supportedMediaTypes屬性賦兩個值[text/html;charset=UTF-8]和[application/json],則[application/json]是無效的
因為此時應答給瀏覽器(或者說請求方)的Content-Type頭資訊都是[text/html;charset=UTF-8],所以給它一個值就行了
如果給supportedMediaTypes的值為[application/json],則應答給瀏覽器的Content-Type頭資訊就是[application/json;charset=UTF-8]

(5)關於features屬性,不是serializerFeature,而是features,詳見FastJsonHttpMessageConverter.java
它是用來控制json序列化輸出時的一些額外屬性,比如說該欄位是否輸出、輸出時key使用單引號還是雙引號、key不使用任何引號等等。
<property name="features"></property>配置如下:
QuoteFieldNames----------輸出key時是否使用雙引號,預設為true
WriteMapNullValue--------是否輸出值為null的欄位,預設為false
WriteNullNumberAsZero----數值欄位如果為null,輸出為0,而非null
WriteNullListAsEmpty-----List欄位如果為null,輸出為[],而非null
WriteNullStringAsEmpty---字元型別欄位如果為null,輸出為"",而非null
WriteNullBooleanAsFalse--Boolean欄位如果為null,輸出為false,而非null
WriteDateUseDateFormat---Date的日期轉換器

(6)通常在網上搜到的fastjson和springMVC整合的例子中都像下面註釋的程式碼那樣給了兩個屬性WriteMapNullValue和QuoteFieldNames
這就表示為json解析器設定QuoteFieldNames和WriteMapNullValue的值為true,即輸出時key使用雙引號,同時也輸出值為null的欄位

(7)輸出時某欄位為String型別,且值為null,此時若需要其輸出,且輸出值為空字串,則需同時賦值WriteMapNullValue和WriteNullStringAsEmpty
經測試,若只賦值WriteNullStringAsEmpty,則不會輸出該欄位..加上WriteMapNullValue屬性後,便輸出了,且輸出值不是null,而是預期的空字串