Domanda

Mi chiedevo se qualcuno potrebbe avere qualche informazione in questo. jqGrid è abbastanza contento di questa stringa JSON:

{'page':'1','total':1,'records':'4','rows':[{'id':1,'title':'Story Manager','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':2,'title':'Analysis','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':3,'title':'Narrative','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':4,'title':'Graphic','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'}]}

Jayrock (NET JSON-RPC quadro) fornisce la stringa JSON come:

{id:'-1','result':{'page':'1','total':1,'records':'4','rows':[{'id':1,'title':'Story Manager','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':2,'title':'Analysis','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':3,'title':'Narrative','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'},{'id':4,'title':'Graphic','assigned':'2009-06-22T10:52:28.0687738-05:00','due':'2009-07-29T10:52:28.0687738-05:00','completed':'2009-07-14T10:52:28.0687738-05:00'}]}}

vale a dire. si aggiunge un "{id:'-1','result':{ /* ... snip ... */ }}" wrapper JSON di lavoro.

Esiste un modo per indicare la proprietà jsonReader del jqGrid al posto giusto per iniziare l'analisi del risultato JSON? Sto avendo un mucchio di tempo con tutto questo:)

--- --- Modifica

volevo postare un esempio veloce ... grazie per la risposta, Stuntz. Tutto ciò che serve per l'esempio che segue è NET, Jayrock , jQuery e jqGrid . Questo funziona con il JSON sopra. Non ricordo se o non è necessario impostare il tipo di contenuto.

var lastsel; // last row selected (for editing)      

jQuery(document).ready(function(){ 
    jQuery("#mygrid").jqGrid({ 
        contentType: "text/plain; charset=utf-8",
        datatype: function(postdata)
        {
            $.ajax({
                url: 'http://localhost:2064/StoryManager/StoryManager.ashx/getPageItemRoles?id=3',
                data: postdata,
                complete: function(response, status)
                {
                    if(status=='success')
                    {
                        var mygrid = jQuery("#mygrid")[0];
                        var o = eval("(" + response.responseText + ")"); // TODO don't use eval.  it's insecure, but older browsers support it...
                        mygrid.addJSONData(o.result);
                    }
                }
            })
        },                
        colNames:['ID', 'Title', 'Assigned To', 'Assigned', 'Due', 'Completed'],
        colModel:[
            {name:'id', label:'ID', jsonmap:'id', hidden: true,  editrules: { edithidden: true }},
            {name:'title', jsonmap:'title', editable: true},
            {name:'assignedto', label:'Assigned To', jsonmap:'assignedto', editable: true},
            {name:'assigned', jsonmap:'assigned', editable: true},
            {name:'due', jsonmap:'due', editable: true},
            {name:'completed', jsonmap:'completed', editable: true}
        ],
        jsonReader: {
            repeatitems: false
        }
    });  
});
È stato utile?

Soluzione

No, non è possibile fare questo via jsonReader. Internamente, la griglia fa:

        ts.p.page = data[ts.p.jsonReader.page];

... che non funziona per un sub-property tratteggiata.

Invece è necessario recuperare i dati della griglia manualmente impostando tipo di dati a una funzione. È quindi possibile recuperare i dati con $ .ajax, e chiamare grid.addJsonData quando si tratta di nuovo, proprio come la griglia fa, solo che invece di passare tutta la risposta si passa un sub-proprietà della risposta.

Altri suggerimenti

Questo post e link sono stati davvero utili. Non ho una chiara comprensione su come questo funziona ancora, ma ho pensato che vorrei solo inviare questo per aiutare qualcuno ad alleviare il loro dolore:)

Questo è il JSON ritorno da getRecords:

  

{ "id": - 1, "risultato": { "pagina": "1", "totale": "1", "record": "2", "file": [{ "id": "13", "invdate": "2007-10-06", "name": "client   3" , "quantità": "1000.00", "tassa": "0.00", "totale": "1000.00", "nota": ""}, { "id": "12", "invdate": "Il 2007 -10-06" , "name": "client   2" , "quantità": "700.00", "tassa": "140.00", "totale": "840.00", "nota": "no   fiscale "}]}}

E questo è il codice di lavoro:

jQuery(document).ready(function(){ 
    jQuery("#list4").jqGrid({ 
        contentType: "text/plain; charset=utf-8",
        datatype: function(postdata)
        {
            $.ajax({
                url: 'http://localhost/Booga/Baba.ashx/getRecords',
                data: "{}", // For empty input data use "{}",
                dataType: "json",
                type: "GET",
                contentType: "application/json; charset=utf-8",
                complete: function(response, status)
                {
                    if(status=='success')
                    {
                        var mygrid = jQuery("#list4")[0];
                        var o = eval("(" + response.responseText + ")");// TODO don't use eval.  it's insecure, but older browsers support it...
                        mygrid.addJSONData(o.result);
                    }
                }
            })
        },                
    colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'],
    colModel:[
        {name:'id',index:'id', width:55},
        {name:'invdate',index:'invdate', width:90, jsonmap:"invdate"},
        {name:'name',index:'name asc, invdate', width:100},
        {name:'amount',index:'amount', width:80, align:"right"},
        {name:'tax',index:'tax', width:80, align:"right"},      
        {name:'total',index:'total', width:80,align:"right"},       
        {name:'note',index:'note', width:150, sortable:false}       
    ],
        jsonReader: {
            repeatitems: false
        }
    });  
});

A proposito, qualcuno sa il motivo per cui utilizzando eval non è sicuro? Guardate il commento sul mio codice. Ho afferrato che parte dal collegamento forum.asp.

  

vale a dire. si aggiunge un "{id: '- 1', 'risultato': {/ * ... snip ... * /}}" wrapper attorno al JSON di lavoro

.

Questo è un effetto collaterale del modo in cui gestisce le risposte JayRock SMD ... "id" è un "identificatore di risposta" ed è un aiuto per le comunicazioni asincrone.

Quindi, se fare fuoco fuori da un mucchio di richieste asincrone (e non aspettare per la risposta), è possibile specificare la "richiesta di ID" e JayRock onorerai che ... in modo da poter allineare le risposte con le richieste.

Spero che fa un po 'di senso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top