将jqGrid的编辑数据序列化为JSON

时间:2011-12-21 21:02:04

标签: jquery json jqgrid

用户在jqGrid中编辑数据后,我想将格式化的JSON字符串返回给要使用的服务器。 以下是服务器期望收到的内容示例:

{
  "aptitudeArrayList":[
    {
      "skill":"VITS",
      "value":2,
      "id":2,
      "color":"RED"
    },
    {
      "skill":"GBFM",
      "value":6,
      "id":1,
      "color":"GREEN"
    },
    {
      "skill":"JSON",
      "value":4,
      "id":3,
      "color":"RED"
    },
    {
      "skill":"CASTLEROCK",
      "value":7,
      "id":4,
      "color":"RED"
    }
  ],
  "cell":12412,
  "line":"FIRST_LINE",
  "name":"Barop",
  "id":1,
  "region":"The end",
  "available":true
}

以下是我的ColModel的一部分:

...
{
    name:'cell',
    label:'Cell #',
    width:80,
    align:'center',
    editable:true,
    editrules:{required:true, integer:true},
    editoptions:{size:10, maxlength:10}
},
{
    name:'available',
    label:'Available',
    formatter:'checkbox',
    width:46,
    align:'center',
    editable:true,
    edittype:'checkbox',
    editoptions:{value:"true:false"}
},
{
    name:"vits.value",
    label:'VITS',
    width:300,
    align:'center',
    editable:true,
    jsonmap:"aptitudeArrayList.0.value"
},
{
    name:"vits.color",
    editable:true,
    jsonmap:"aptitudeArrayList.0.color"
}
...

以下是编辑选项:(我注释掉了postdata,因为它现在不需要)

var editOptions = {
    onclickSubmit:function (params, postdata) {
        params.url = URL + '/'; //+ postdata.id;
    }
};

调用编辑后,数据将发送到此函数:

$.extend($.jgrid.edit, {
    closeAfterEdit:true,
    closeAfterAdd:true,
    ajaxEditOptions:{ contentType:"application/json" },
    mtype:'PUT',
    serializeEditData:function (data) {
        delete data.oper;
        return JSON.stringify(data);
    }
});

上面的代码不足会返回此JSON:

{
  "id":"1",
  "name":"Barop",
  "region":"The end",
  "line":"FIRST_LINE",
  "cell":"12412",
  "available":"true",
  "vits.value":"2",
  "vits.color":"RED"
  ...
}

当我附加调试器时,我发现data包含:dataObject { id="1", name="Barop", region="The end", ... vits.value="2", vits.color="RED"}它似乎是从jqGrid中的name属性获取密钥。

如何将数据序列化为服务器所需的格式?

1 个答案:

答案 0 :(得分:2)

解决问题的最简单方法似乎是对您使用的serializeEditData的修改。它可以是以下

serializeEditData: function (data) {
    return JSON.stringify({
        id: parseInt(data.id, 10),
        name: data.name,
        line: data.line,
        cell: parseInt(data.cell, 10),
        available: data.available === 'true',
        aptitudeArrayList: [
            value: data.value,
            color: data.color
        ]
    });
}

此外,我建议您最好不要在name属性中使用积分或任何其他meta-characters。您可以将name: "vits.value"重命名为name: "value"或使用其他index属性

name: "value",
index: "vits.value",
jsonmap: "aptitudeArrayList.0.value"