JqueryDataTable獲取不到springmvcResponseBody返回的json對象

JqueryDatatable是一個很強大的jquery的table插件,能夠訪問官網http://www.datatables.net/,中文學習網站 http://datatables.club/index.html html

Datatable支持ajax獲取對應的數據,具體能夠參考官網的ajax參數說明java

http://datatables.club/reference/option/ajax.html jquery

其中ajax第二個傳object的用法和jquery的ajax的原生用法是同樣的web

http://api.jquery.com/jQuery.ajax/ ajax

其中幾個重要的參數以下spring

data( ajax.dataDT ) - 與jQuery同樣,接收一個對象,這裏Datatables對他作出擴展,還能夠接收 function,做爲function時能夠操做請求參數,在實際應用中,能夠在此函數里加入自定義的條件傳到服務器。這個方法在1.9-版本中爲 fnServerParams 。
dataSrc( ajax.dataSrcDT ) - 若是Datatables是經過ajax或者服務器取數,默認狀況下,Datatables會去找返回數據中的 data(或者是 aaData兼容1.9-)去顯示錶格。這個方法已經取代了1.9-中的 sAjaxDataProp
success - 這個是在Datatables內部調用的,不能覆蓋使用,若是你不滿意Datatables的實現,你可使用 ajax.dataSrcDT 處理,或者是把 ajax做爲一個函數使用

請注意,success這個函數是datatables內部調用的,是不能覆蓋使用的。shell

===========================================================json

背景和技術介紹完畢,作一個功能,後臺使用springmvc返回一個json對象,json對象其中一部分屬性是一個列表,前臺用datatable來展現這個列表的數據。api

@RequestMapping(value="getManagerItems.do")
@ResponseBody
public BaseJsonResult getManagerItems(HttpServletRequest request,
                                 HttpServletResponse response,
                                 HttpSession session) {
    try{
        Map<String,String> userMap=getBucUser(request);
        List<ManagerItemDO> result=service.getManagerItems(userMap);
        SuccessJsonResult successJsonResult=new SuccessJsonResult(JSON.toJSONString(result));
        return successJsonResult;
    }catch (Exception e){
        logger.error(e);
        FailureJsonResult failureJsonResult=new FailureJsonResult(e.getMessage(),e);
        return failureJsonResult;
    }
}

其中對應的result已經使用了JSON.toJSONString 轉成了對應的string對象。服務器

如下是返回結果

{
    "root": "[{\"functionName\":\"FILTER_GROUP\",\"gmtCreate\":1457681086000,\"gmtModified\":1457681086000,\"id\":99,\"keykey\":\"XXX\",\"moduleName\":\XXX\",\"valuevalue\":\"XXX\"}]",
    "status": "1",
    "e": null,
    "comments": null
}


spring中對json的轉換器的配置以下,基本上就是默認的配置,其中能夠看到root的結果並非一個json對象,而是一個帶有雙引號的字符串

   <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">      
       <property name="messageConverters">      
           <list >      
               <ref bean="mappingJacksonHttpMessageConverter" />      
           </list>      
       </property>      
   </bean>
   
   <bean id="mappingJacksonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
    <property name="supportedMediaTypes">
        <list>
            <value>application/json;charset=UTF-8</value>
            <value>text/html;charset=UTF-8</value>
       </list>
    </property>
</bean>

解決方案1:自定義一個MessageConverter,將其中的string的對象的外引號去掉,可是這種方案實現較爲複雜,會對之前的json處理有影響。

前臺的datatable的調用方式以下, 表示訪問上文的服務地址,而後取其中root的節點的內容:

 .dataTable( {
                    ajax: {
                        url: "<%=request.getContextPath()%>/getManagerItems.do",
                        dataSrc: 'root'
                    },
                    "columns": [
                        { "data": "keykey" }
                    ]
                    })

因爲root並非一個json對象,因此在解析對應的數據的時候datatable插件將返回數據按照json來處理,可是拿到的確是對應的stirng對象

解決方案2:datasrc支持自定義的function,咱們用自定義的function來調用json解析方法解析對應字符串

.dataTable( {
                    ajax: {
                        url: "<%=request.getContextPath()%>/getManagerItems.do",
                        dataSrc: function ( data ) {
                            var result = $.toJSON( data );
                            if($.evalJSON(result).status>0){
                                var result1=$.evalJSON($.evalJSON(result).root);
                                return result1;
                            }else{
                                var error=$.evalJSON(result).root;
                                showAlert('獲取配置項失敗',error,1000);
                            }
                        }

                    },
                    "columns": [
                        { "data": "keykey" }
                    ]

datasrc的使用能夠參考文檔 http://datatables.club/reference/option/ajax.dataSrc.html

相關文章
相關標籤/搜索