2013-04-18 3 views
2

У меня есть jqGrid, который отправляет запросы ajax на мой сервер. Однако мой сервер отправляет ответ json в совершенно другом формате (я не могу его изменить). Поэтому мне нужно проанализировать ответ с моего сервера, поэтому мой jqGrid может корректно отображать данные.jqGrid - Parsing json response

Если я понял правильно, я могу использовать ajaxGridOptions с конвертеры. Итак, я могу зафиксировать ответ и проанализировать его. Мне кажется, что преобразователи работают нормально и правильно разбирают ответ. Однако jqGrid не понимает мой анализируемый ответ. Он отображает сообщение «Загрузка ...» навсегда (я вижу в firebug, что запрос/ответ прекрасен, и в консоли нет ошибки javascript).

Может ли кто-нибудь помочь мне с этим?

Вот мой код:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html><head> 
    <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/themes/redmond/jquery-ui.css" /> 
    <link rel="stylesheet" type="text/css" href="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.1.2/css/ui.jqgrid.css" /> 
</head><body> 

<!-- IMPORT JS --> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.14/jquery-ui.min.js"></script> 
    <script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.1.2/js/i18n/grid.locale-en.js"></script> 
    <script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-4.1.2/js/jquery.jqGrid.min.js"></script>  

<script> 

$(document).ready(function() { 
    var parsedResponse = '{"currentPage" : "1", "totalRecords" : 5, "pageSize" : 3,' 
      + '"myData" :[{"id" : "1", "name" : "Name 1" },' 
      + '   { "id" : "3", "name" : "Name 3" },' 
      + '   { "id" : "2", "name" : "Name 2" }]' 
      + '}'; 

    var myGrid = $('<table>').attr("id", "useraccount-search-datagrid"); 
    var myPager = $("<div>").attr("id", "useraccount-search-datagrid-pager"); 

    $("body").append(myGrid, myPager); 

    myGrid.jqGrid({ 
     pager : myPager, 
     // datastr: parsedResponse, // If I use these parameters and remove ajaxGridOptions then it will work fine with the local data 
     // datatype : "jsonstring", // If I use these parameters and remove ajaxGridOptions then it will work fine with the local data 
     serializeGridData : function(data) { 
      return '{"SearchCriteria": {"keyword":"emai","orderByField":"userName","sortOrder":"DESC","pagination":{"pageSize":"10","pageNumber":"2"}}}'; 
     }, 
     ajaxGridOptions: { 
      url: "../rush-controller-testing/userAccount/find", 
      type: "POST", 
      contentType: "application/json; charset=utf-8",   
      dataType: "json", 
      converters: { "text json": function (responseText) { 
        // console.log(responseText); // Shows the response string from the cerver 
        return parsedResponse; 
       } 
      }, 
      success: function(data, textStatus, jqXHR) { 
       // Nice! It shows 'parsedResponse' from 'converters'. Looks good so far. 
       console.log(data); console.log(textStatus); console.log(jqXHR); 
      } 
     }, 
     colModel : [ 
      { name : 'name', index : 'id', width : "500"} 
     ], 
     jsonReader: { 
      root: "myData", page: "currentPage", records: "totalRecords" 
     }, 
     rowNum : 3, 
     viewrecords : true, 
     height : "auto", 
     ignoreCase : true, 
     hidegrid: false 
    }); 

}); 
</script> 
</body> 
</html> 

=== UPDATE ===

Мой ответ сервер что-то вроде:

{"UserAccountSearchResult":{ 
    "userAccounts":[{ 
     "userAccountId":18, 
     "clientAccount":{"clientAccountId":19,"name":"name:5791","firstName":"firstName:5791","lastName":"lastName:5791","active":true}, 
     "userName":"[email protected]", 
     "password":"password824504", 
     "firstName":"firstName824504", 
     "lastName":"lastName824504", 
     "isActive":true, 
     "phoneNumbers":{"phoneNumberId":36,"number":824504824504}, 
     "addresses":{"addressId":126,"country":"CANADA","provinceOrState":"ONTARIO","address":"address824504","city":"Windsor","postalCode":"postalCode824504"}, 
     "emails":{"emailId":36,"email":"[email protected]"} 
     },{ 
     "userAccountId":44, 
     "clientAccount":{"clientAccountId":45,"name":"name:3136","firstName":"firstName:3136","lastName":"lastName:3136","active":true}, 
     "userName":"[email protected]", 
     "password":"password796312", 
     "firstName":"firstName796312", 
     "lastName":"lastName796312", 
     "isActive":true, 
     "phoneNumbers":{"phoneNumberId":88,"number":796312796312}, 
     "addresses":{"addressId":298,"country":"CANADA","provinceOrState":"ONTARIO","address":"address796312","city":"Greater Sudbury","postalCode":"postalCode796312"}, 
     "emails":{"emailId":88,"email":"[email protected]"} 
     }] 
    ,"pagination":{"pageSize":10,"pageNumber":2,"totalItems":49}}} 

Итак, у меня уже есть функция для анализа этого ответа на что-то вроде ниже. И я хочу использовать этот разобранный ответ с jqGrid, потому что в моем приложении есть много случаев, как, что:

{"currentPage" : "1", "totalRecords" : 2, "pageSize" : 3, 
    "myData" :[{ 
     "id" : "1", "name" : "firstName824504", "email" : "[email protected]" 
    },{ 
     "id" : "3", "name" : "firstName796312", "email" : "[email protected]" 
    }] 
}; 

=== FINAL КОД ===

Я получил это работает. Спасибо за помощь. Вот мой функциональный пример. Надеюсь, это может помочь кому-то еще в будущем.

$(document).ready(function() { 
    /* 
    * Here I will have a very complex logic to parse the response from the server in something jqGrid can understand. 
    * Right now it is just a hard-coded string to make thinks easer to understand 
    */ 
    function parseResponse(responseText){ 
     var parsedResponse = '{"currentPage" : "1", "totalRecords" : 5, "pageSize" : 3, "pageTotal" : 2,' 
       + '"myData" :[{"id" : "1", "name" : "Name 1" },' 
       + '   { "id" : "3", "name" : "Name 3" },' 
       + '   { "id" : "2", "name" : "Name 2" }]' 
       + '}'; 
     return JSON.parse(parsedResponse); 
    }; 

    var myGrid = $('<table>').attr("id", "useraccount-search-datagrid"); 
    var myPager = $("<div>").attr("id", "useraccount-search-datagrid-pager"); 

    $("body").append(myGrid, myPager); 

    myGrid.jqGrid({ 
     pager : myPager, 
     // datastr: parsedResponse, // If I use these parameters and remove ajaxGridOptions then it will work fine with the local data 
     datatype : "json", 
     url: "../rush-controller-testing/userAccount/find", 
     mtype: "POST", 
     serializeGridData : function(data) { 
      // That is just a hard-coded example to make things easier to understand. Will change it to a more complex logic later. 
      return '{"SearchCriteria": {"keyword":"emai","orderByField":"userName","sortOrder":"DESC","pagination":{"pageSize":"10","pageNumber":"3"}}}'; 
     }, 
     ajaxGridOptions: { 
      contentType: "application/json; charset=utf-8", 
     }, 
     colModel : [ 
      { name : 'name', index : 'name', width : "500"} 
     ], 
     jsonReader: { 
      repeatitems: false, 
      root: function(data){ 
       //the actual data 
       var result = parseResponse(data); 
       return result.myData; 
      }, 
      total: function(data) { 
       //total pages for the query 
       var result = parseResponse(data); 
       return result.pageTotal; 
      }, 
      page: function(data){ 
       //current page of the query 
       var result = parseResponse(data); 
       return result.currentPage; 
      }, 
      records: function(data){ 
       //total number of records for the query 
       var result = parseResponse(data); 
       return result.totalRecords; 
      } 
     }, 
     rowNum : 3, 
     viewrecords : true, 
     height : "auto", 
     ignoreCase : true, 
     hidegrid: false 
    }); 

}); 
+0

Что это за «странный формат», который сервер отправляет обратно? –

+0

Это не ошибка, а просто ответ (формат JSON), отправленный с сервера, который я должен проанализировать. – Rafa

ответ

2

Вы используете опцию jqGrid неправильно. Важно понимать, что jqGrid необходимо «знать» некоторые параметры, такие как url и datatype. Если datatype не указано, будет использоваться значение по умолчанию "xml".

Вы не должны перезаписывать параметры относительно ajaxGridOptions, которые уже существуют в jqGrid. Поэтому вы должны правильно использовать jqGrid. Если URL "../rush-controller-testing/userAccount/find" возвращает данные в формате, который Вы включили в parsedResponse то код может быть примерно следующее:

myGrid.jqGrid({ 
    url: "../rush-controller-testing/userAccount/find", 
    datatype: "json", 
    mtype: "POST", 
    pager: "#useraccount-search-datagrid-pager", 
    serializeGridData : function(data) { 
     // the function is DUMMY. it MUST be replaced 
     return '{"SearchCriteria": {"keyword":"emai","orderByField":"userName","sortOrder":"DESC","pagination":{"pageSize":"10","pageNumber":"2"}}}'; 
    }, 
    ajaxGridOptions: { contentType: "application/json; charset=utf-8" }, 
    colModel: [ 
     { name: 'id', key: true, width: 100 } 
     { name: 'name', width: 400 } 
    ], 
    jsonReader: { 
     root: "myData", 
     page: "currentPage", 
     records: "totalRecords", 
     repeatitems: false 
    }, 
    rowNum: 3, 
    gridview: true, 
    autoencode: true, 
    viewrecords: true, 
    height: "auto", 
    ignoreCase: true, 
    hidegrid: false 
}); 

Использование repeatitems: false собственности внутри jsonReader действительно требуется. Я не думаю, что вам нужно будет использовать converters jQuery.ajax.

+1

Большое спасибо за ваш подробный ответ. Я собираюсь попробовать эти изменения и сообщить вам очень скоро.(Кстати, вы написали много других хороших ответов на stackoverflow, спасибо за вклад). – Rafa

+0

@YoriKusanagi: Добро пожаловать! Я рад, что мои старые ответы тоже помогут вам. Кстати, во многих случаях можно использовать опцию «prmNames» для настройки параметров, которые будут отправляться на сервер. 'serializeGridData' - это только последний шаг преобразования информации. – Oleg

+1

в этот момент, моя настоящая задача - разобрать ответ с сервера. Я работал над этим много часов и не мог понять, что происходит неправильно. Любая помощь будет высоко оценен. – Rafa

0

Посмотрите на data manipulation pages на jqGrid wiki. Думаю, jsonReader может быть тем, что вы ищете.

+0

Я пытался использовать jsonReader, но в моем случае это не сработало. Данные, отправленные с сервера, сильно отличаются. Поэтому мне нужна сложная функция синтаксического анализа. – Rafa