Проблема с заполнением ext grid значениями JSON

#java #json #extjs #grid

#java #json #extjs #сетка

Вопрос:

Я новичок в Ext, и у меня проблема: я пытаюсь заполнить extjs-grid данными:

     Ext.onReady(function() {
        var store = new Ext.data.JsonStore({
            root: 'topics',
            totalProperty: 'totalCount',
            idProperty: 'threadid',
            remoteSort: true,
            autoLoad: true, ///

            fields: [
                'title', 'forumtitle', 'forumid', 'author',
                {name: 'replycount', type: 'int'},
                {name: 'lastpost', mapping: 'lastpost', type: 'date', dateFormat: 'timestamp'},
                'lastposter', 'excerpt'
            ],

            proxy: new Ext.data.ScriptTagProxy({
            url:'http://10.10.10.101:8080/myproject/statusList/getJobs/2-10/search-jobname-/sort-asdf/filterjobname-123/filterusername-davs/filterstatus-completed/filtersubmdate-today',
            method : 'GET'
        })
    });

    //
    var cm = new Ext.grid.ColumnModel([
        {sortable:true, id : 'id',          dataIndex:'id'},
        {sortable:true, id : 'title',       dataIndex:'title'},
        {sortable:true, id : 'forumtitle',  dataIndex:'forumtitle'},
        {sortable:true, id : 'forumid',     dataIndex:'forumid'},
        {sortable:true, id : 'author',      dataIndex:'author'}
    ]);

    var grid = new Ext.grid.GridPanel({
        id: 'mainGrid',
        el:'mainPageGrid',
        pageSize:10,
        store:store,
        //    stripeRows: true,
        cm:cm,
        stateful: false, // skipSavingSortState
        viewConfig:{
            forceFit:true
        },
        //        width:1000,
        //        height:700,
        loadMask:true,
        frame:false,

        bbar: new Ext.PagingToolbar({
            id : 'mainGridPaginator',
            store:store,
            hideRefresh : true,
            plugins: new Ext.ux.Andrie.pPageSize({
                beforeText: 'View: ',
                afterText: '',
                addAfter: '-',
                variations: [10, 25, 50, 100, 1000]
                //comboCfg: {
                    //id: '${ dispview_widgetId }_bbar_pageSize'
                //}
            }),
            displayMsg: 'Displaying items {0} - {1} of {2}',
            emptyMsg:'No data found',
            displayInfo:true
        })
    });

    grid.render();
});
  

и часть Java:

 @GET
@Path("/getJobs/{startFrom}-{startTo}/search-{searchType}-{searchName:.*}/"  
        "sort-{sortType}/filterjobname-{filterJobName:.*}/filterusername-{filterUsername:.*}/"  
        "filterstatus-{filterStatus:.*}/filtersubmdate-{filterSubmittedDate:.*}")
@Produces({"application/json"})
@Encoded
public String getJobs(
        @PathParam("startFrom")             String startFrom,
        @PathParam("startTo")               String startTo,
        @PathParam("searchType")            String searchType,
        @PathParam("searchName")            String searchName,
        @PathParam("sortType")              String sortType,
        @PathParam("filterJobName")         String filterJobName,
        @PathParam("filterUsername")        String filterUsername,
        @PathParam("filterStatus")          String filterStatus,
        @PathParam("filterSubmittedDate")   String filterSubmittedDate) {


    return "{totalCount:'3',topics:[{title:'XTemplate with in EditorGridPanel',threadid:'133690',username:'kpremco',userid:'272497',dateline:'1305604761',postid:'602876',forumtitle:'Ext 3x Help',forumid:'40',replycount:'2',lastpost:'1305857807',lastposter:'kpremco',excerpt:'Hi I have an EditiorGridPanel whose one column i am using XTemplate to render and another Column is Combo Box FieldWhen i render the EditorGri'},"  
                                             "{title:'IFrame error _flyweights is undefined',threadid:'133571',username:'Daz',userid:'52119',dateline:'1305533577',postid:'602456',forumtitle:'Ext 3x Help',forumid:'40',replycount:'1',lastpost:'1305857313',lastposter:'Daz',excerpt:'For Ext 330 using Firefox 4  Firebug, the following error is often happening when our app loads e._flyweights is undefined Yetthis '},"  
                                             "{title:'hellllllllllllllpwhy it doesnt fire cellclick event after I change the cell value',threadid:'133827',username:'aimer311',userid:'162000',dateline:'1305700219',postid:'603309',forumtitle:'Ext 3x Help',forumid:'40',replycount:'3',lastpost:'1305856996',lastposter:'aimer311',excerpt:'okI will discribe this problem as more detail as I canI look into this problem for a whole dayI set clicksToEdit1 to a EditorGridPanelso when I'}]}";
  

В результате я получаю ошибку JavaScript:

 Syntax error at line 1 while loading:
totalCount:'3',topics:[{title:'XTemplate
---------------------^
expected ';', got ':'
  

Хотя, когда я использую URL прокси:

 URL: 'http://extjs.com/forum/topics-browse-remote.php',
  

который представляет ту же информацию, у меня нет никаких проблем.

В чем моя ошибка????

PS Комментарии к первому ответу:

     return "{"totalCount":"3","topics":[{"title":"XTemplate with in EditorGridPanel","threadid":"133690","username":"kpremco","userid":"272497","dateline":"1305604761","postid":"602876","forumtitle":"Ext 3x Help","forumid":"40","replycount":"2","lastpost":"1305857807","lastposter":"kpremco","excerpt":"Hi I have an EditiorGridPanel whose one column i am using XTemplate to render and another Column is Combo Box FieldWhen i render the EditorGri"},"  
                                             "{"title":"IFrame error _flyweights is undefined","threadid":"133571","username":"Daz","userid":"52119","dateline":"1305533577","postid":"602456","forumtitle":"Ext 3x Help","forumid":"40","replycount":"1","lastpost":"1305857313","lastposter":"Daz","excerpt":"For Ext 330 using Firefox 4  Firebug, the following error is often happening when our app loads e._flyweights is undefined Yet, this "},"  
                                             "{"title":"hellllllllllllllpwhy it doesn't fire cellclick event after I change the cell value","threadid":"133827","username":"aimer311","userid":"162000","dateline":"1305700219","postid":"603309","forumtitle":"Ext 3x Help","forumid":"40","replycount":"3","lastpost":"1305856996","lastposter":"aimer311","excerpt":"okI will discribe this problem as more detail as I canI look into this problem for a whole dayI set clicksToEdit1 to a EditorGridPanelso when I"}]}";
  

У меня следующая ошибка:

 Syntax error at line 1 while loading:
{"totalCount":"3","topics":[{"title
-------------^
expected ';', got ':'
  

PS # 2. Когда я добавил ‘[‘ в начало строки ответа и ‘]’ в конец, ошибки исчезли, но сетка не была заполнена данными

Ответ №1:

Вы не возвращаете (допустимый) JSON. Обратитесь к сайту JSON для получения подробной информации, но, например, все ключи свойств должны быть в двойных кавычках. (Все строки также должны быть в двойных кавычках; одинарные кавычки недопустимы для строк JSON.)

Так, например, это не допустимый JSON:

 {totalCount:'3'}
  

…потому что ключ не в кавычках, а значение заключено в одинарные кавычки. Правильный JSON был бы:

 {"totalCount":"3"}
  

…если вы действительно хотите, чтобы 3 это была строка, или:

 {"totalCount":3}
  

…если 3 должно быть число.

Люди часто путают JSON и объектную литеральную нотацию JavaScript, но они разные. В частности, JSON является подмножеством объектной литеральной нотации. Многие вещи, которые допустимы в объектной литеральной нотации, недопустимы в JSON. В любой момент, когда вы сомневаетесь, вы можете проверить на jsonlint.com, который предоставляет надлежащий валидатор JSON.

Комментарии:

1. Я прокомментировал в конце своего вопроса

2. @davs: Вы по-прежнему не возвращаете допустимый JSON (вы пропустили некоторые кавычки, например, вокруг «темы», и могут возникнуть другие проблемы). Итак, первое, что нужно сделать, это убедиться, что вы действительно возвращаете допустимый JSON. Я подозреваю, что происходит что-то еще, но это первый шаг.

3. Большое спасибо за JSON validator, я снова изменил возвращаемую строку, но даже если он говорит, что JSON допустим, у меня проблемы….

4. @davs: Да, в вашем последнем обновлении теперь действительный JSON, так что, по крайней мере, вы устранили это.

5. Но все равно я получаю ошибку ‘expected’;’, got’:» (как я описал в конце вопроса)

Ответ №2:

Я нашел корень проблемы.

Как я знаю, Ext отправляет в мою функцию веб-службы параметр ‘callback=[some_callback_name]’ (например, callback1001). Это означает, что Extjs хотят получать результаты не только в формате JSON, но и в формате ‘callback1001()’. Когда я вернул свои данные в этом формате, все стало хорошо.

Ссылки для подтверждения: