我正在尝试将ColdFusion查询输出到JSON,以便它可以与jQuery EasyUI(特别是Datagrid)一起使用。
从 EasyUI 附带的示例 .json 文件来看,这是他们正在寻找的格式......
{"total":2
, "rows":[
{ "productid":"FI-SW-01"
, "productname":"Koi"
, "unitcost":10.00
, "status":"P"
, "listprice":36.50,"attr1":"Large"
, "itemid":"EST-1"
}
, { "productid":"K9-DL-01"
, "productname":"Dalmation"
, "unitcost":12.00
, "status":"P"
, "listprice":18.50
, "attr1":"Spotted Adult Female"
, "itemid":"EST-10"
}
]
}
但是,当我在 ColdFusion 查询中使用SerializeJSON(emails)
时,我得到这个:
{ "COLUMNS":["CUSTOMERID","CUSTOMERFIRSTNAME"]
, "DATA":[
[101,"Bhavin"],[102,"Frank"]
]
}
这似乎没有被 EasyUI 识别,所以我想问题是 (1) EasyUI 是否应该能够识别和使用 ColdFusion 的输出,如图所示,或者 (2) 有没有办法让 ColdFusion 以类似于 EasyUI 示例中包含的格式输出 JSON?
更新:
如果我使用 serializeQueryByColumns
参数,它看起来像这样:
{ "ROWCOUNT":83
, "COLUMNS":["CUSTOMERID","CUSTOMERFIRSTNAME"]
, "DATA":{
"CUSTOMERID":[101,102]
,"CUSTOMERFIRSTNAME":["Bhavin","Frank","]
}
}
仍然没有被EasyUI识别。在他们的文档中,他们展示了一个看起来像这样的 php 示例,所以我想这是我尝试用 ColdFusion 复制的输出:
$rs = mysql_query('select * from users');
$result = array();
while($row = mysql_fetch_object($rs)){
array_push($result, $row);
}
echo json_encode($result);
谢谢!
datagrid的loadFilter
函数可以将任何数据转换为可以加载到datagrid中的标准数据格式。
<script>
var data = { "ROWCOUNT":83
, "COLUMNS":["CUSTOMERID","CUSTOMERFIRSTNAME"]
, "DATA":{
"CUSTOMERID":[101,102]
,"CUSTOMERFIRSTNAME":["Bhavin","Frank"]
}
};
function myLoadFilter(data){
var result = {total:data.ROWCOUNT};
var rows = [];
var count = data.DATA[data.COLUMNS[0]].length;
for(var i=0; i<count; i++){
var row = {};
$.map(data.COLUMNS, function(field){
row[field] = data.DATA[field][i];
})
rows.push(row);
}
result.rows = rows;
return result;
}
</script>
数据网格组件可以声明为:
<table class="easyui-datagrid" title="Basic DataGrid" style="width:700px;height:250px"
data-options="
singleSelect:true,
collapsible:true,
data:data,
loadFilter:myLoadFilter
">
<thead>
<tr>
<th data-options="field:'CUSTOMERID',width:100">CUSTOMERID</th>
<th data-options="field:'CUSTOMERFIRSTNAME',width:200">CUSTOMERFIRSTNAME</th>
</tr>
</thead>
</table>
该示例可从 http://jsfiddle.net/d8zYy/
EasyUI DataGris不会接受自定义的数据格式(这是一种耻辱,因为除此之外,数据网格看起来非常好)
将 CF 查询转换为 EasyUI 的正确格式应该很简单:
- 创建结构以保存数据
- 设置结构.总计=查询。RecordCount(如果这是它想要的。对于远程分页,无论当前页面如何,它都更有可能是总结果)
- set struct.rows=ArrayNew(1)
- 循环查询 (
<cfloop query='myQuery'>
- 创建一个新结构,行数据
- 遍历字段('myQuery.columnList')
- set struct.columnName = myQuery['columnName']
- ArrayAppend(struct.rows,rowData)
- 返回结构
我开始怀疑写上面的列表和写实际函数一样长......