Pregunta

Me preguntaba si alguien podría tener una idea de esto. jqGrid es muy feliz con esta cadena 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 marco) suministra la cadena JSON como:

{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'}]}}

es decir. se añade un envoltorio "{id:'-1','result':{ /* ... snip ... */ }}" todo el JSON de trabajo.

¿Hay alguna forma para señalar la propiedad JsonReader de jqGrid al lugar correcto para empezar a analizar el resultado JSON? Estoy teniendo un infierno de tiempo con todo esto:)

--- --- editar

Yo quería publicar un ejemplo rápido ... gracias por su respuesta, Stuntz. Todo lo que se necesita para el siguiente ejemplo es .NET, Jayrock , jQuery y jqGrid . Esto funciona con el JSON anteriormente. Me olvido de si es o no es necesario configurar el tipo de contenido.

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
        }
    });  
});
¿Fue útil?

Solución

No, no se puede hacer esto a través de JsonReader. Internamente, la red hace:

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

... que no funcionará para una punteada sub-propiedad.

En lugar tendrá que buscar los datos de la red de forma manual mediante el establecimiento de tipo de datos a una función. A continuación, puede recuperar los datos con $ .ajax, y llamar a grid.addJsonData que al regresar, al igual que la red hace, excepto que en lugar de pasar toda la respuesta que pasará por una sub-característica de la respuesta.

Otros consejos

Este mensaje y los enlaces han sido de gran ayuda. No tengo una comprensión clara de cómo funciona esto todavía, pero pensé que me acaba de publicar esto para ayudar a alguien a aliviar su dolor:)

Este es el regreso de JSON getRecords:

  

{ "id": - 1, "número": { "página": "1", "total": "1", "registros": "2", "filas": [{ "id": "13", "invdate": "2007-10-06", "name": "Cliente   3" , "cantidad": "1000.00", "impuesto": "0.00", "total": "1000.00", "nota": ""}, { "id": "12", "invdate": "2007 -10-06" , "name": "Cliente   , "Cantidad 2" ": "700.00", "impuesto": "140.00", "total": "840.00", "nota": "sin   impuesto "}]}}

Y este es el código de trabajo:

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
        }
    });  
});

Por cierto, ¿alguien sabe por qué el uso de eval es inseguro? Mira el comentario en mi código. Tomé esa parte del enlace forum.asp.

  

es decir. se añade un "{id: '- 1', 'resultado': {/ * ... * ... * snip /}}" envoltura alrededor de la JSON de trabajo

.

Este es un efecto secundario de la forma en que trata las respuestas JayRock SMD ... el "id" es un "identificador de respuesta" y es una ayuda para las comunicaciones asíncronas.

Por lo tanto, si a encender de un montón de peticiones asíncronas (y no esperar a la respuesta), se puede especificar el "ID de solicitud" y JayRock honraréis que ... para que pueda alinearse con las respuestas las solicitudes.

Espero que tenga un poco de sentido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top