我有一个ColdFusion组件,它将返回一些JSON数据:
component
{
remote function GetPeople() returnformat="json"
{
var people = entityLoad("Person");
return people;
}
}
不幸的是,返回的JSON中所有的属性名都是大写的:
[
{
FIRSTNAME: "John",
LASTNAME: "Doe"
},
{
FIRSTNAME: "Jane",
LASTNAME: "Dover
}
]
是否有任何方法强制框架返回JSON,以便属性名称都是小写的(也许是别人写的自定义UDF/CFC)?
是的,不幸的是,这就是ColdFusion的工作方式。当设置一些变量时,你可以强制使用小写,就像structs一样:
<cfset structName.varName = "test" />
将为变量设置大写名称。但是:
<cfset structName['varname'] = "test" />
将强制使用小写(或驼峰大小写,取决于你传递的内容)。
但是你正在做的ORM的东西,我不认为你能够有任何控制它。如果我说错了,有人来纠正我。
从http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_s_03.html
注意:ColdFusion内部表示使用的结构键名全大写字符,因此将键名序列化为全大写JSON表示。任何处理JSON的JavaScriptColdFusion结构的表示必须使用全大写结构键名,如CITY或STATE。你也可以使用全大写名称COLUMNS和DATA作为两个数组的键以JSON格式表示ColdFusion查询
如果你自己定义变量,你可以使用括号符号(如Jason的答案所示),但对于像ORM这样的内置东西,我认为你被卡住了——除非你想创建自己的结构体,并手动克隆ORM版本,小写每个键,但这不是一个很好的解决方案。:/
这应该像你描述的那样工作。
component
{
remote function GetPeople() returnformat="json"
{
var people = entityLoad("Person");
var rtn = [];
for ( var i = 1; i <= arrayLen( people ); i++ ) {
arrayAppend( rtn, {
"firstname" = people[i].getFirstname(),
"lastname" = people[i].getLastname()
} );
}
return rtn;
}
}
如果任何实体属性返回null,则struct key不存在。要解决这个问题,可以输入
component
{
remote function GetPeople() returnformat="json"
{
var people = entityLoad("Person");
var rtn = [];
for ( var i = 1; i <= arrayLen( people ); i++ ) {
var i_person = {
"firstname" = people[i].getFirstname(),
"lastname" = people[i].getLastname()
};
if ( !structKeyExists( i_person, "firstname" ) ) {
i_person["firstname"] = ""; // your default value
}
if ( !structKeyExists( i_person, "lastname" ) ) {
i_person["lastname"] = ""; // your default value
}
arrayAppend( rtn, i_person );
}
return rtn;
}
}