我正在构建一个Railo应用程序,它处理通过Ajax来回发送的大量JSON数据。我发现了一个优化其性能的机会,但在我解决之前,我想听听社区的一些建议。
这是一个很好的例子。
我在服务器上有一个查询一组出价响应的操作,将它们序列化为JSON,然后将它们返回到前端的javascript,然后解析并呈现一些HTML。 Railo返回JSON的格式是熟悉的双节点对象:
{"COLUMNS":["one","two","three",...],"DATA":["value","value","value",...]}
我写了一个函数,利用underscore的map()函数将这种格式转换为具有命名节点的对象数组:
function toArgsObject(data,columns) {
return _.map(data, function(w){
var q = {};
for (var i=0; i < w.length; i++) { eval("q."+columns[i]+" = w[i]"); };
return q;
});
};
这可以很好地完成工作,然而性能不是很好!即使使用像webkit和firefox那样的swift js解释器,这个函数通常占据处理时间的75%。调用它的函数,特别是当数据集很大时。我想看看通过将这个处理卸载到服务器可以获得多少改进,但是我没有完全使用cfml / cfscript chops来编写一个有效的版本。
然后,我需要从服务器返回的内容如下所示:
[
{"one":"value","two":"value","three":"value"},
{"one":"value","two":"value","three":"value"}.
...
]
我知道SerializeJSON使用的格式会创建更小的响应,因此使用更少的带宽来发送。这就是实验的用武之地。我想看看它如何影响我的应用程序以不同的方式做事!
是否有人编写了可以以此格式返回数据的JSON Serializer?
答案 0 :(得分:6)
如果您需要JS中的结构数组,您可以轻松地将查询转换为服务器端的此类数据集并应用SerializeJSON()。
快速示例1
<cfset dataset = [
{"one":"value","two":"value","three":"value"},
{"one":"value","two":"value","three":"value"}
] />
<cfoutput><p>#SerializeJSON(dataset)#</p></cfoutput>
(我喜欢 Railo中结构定义语法的自由)
快速示例2
<cfquery datasource="xxx" name="qGetRecords">
select userId, login, email from users limit 0,3
</cfquery>
<cfset dataset = [] />
<cfloop query="qGetRecords">
<cfset record = {} />
<cfset record["one"] = qGetRecords.userId />
<cfset record["two"] = qGetRecords.login />
<cfset record["three"] = qGetRecords.email />
<cfset ArrayAppend(dataset, record) />
</cfloop>
<cfoutput>
<p>#SerializeJSON(qGetRecords)#</p>
<p>#SerializeJSON(dataset)#</p>
</cfoutput>
应该适合你。
答案 1 :(得分:2)
eval
只能用于极少数情况,而且肯定不是其中之一。停止使用eval并改为:
q[columns[i]] = w[i];
在JavaScript中,foo['bar']
相当于foo.bar
。
答案 2 :(得分:2)
在Coldfusion 10或Railo 4中,您可以使用toArray() function的Underscore.cfc library将查询转换为您想要的格式,然后再调用serializeJSON()。 cfscript中的示例:
exampleQuery = queryNew("one,two,three","Varchar,Varchar,Varchar",
[
["value","value","value"],
["value","value","value"]
]);
arrayOfStructs = _.toArray(exampleQuery);
serializeJSON(arrayOfStructs);
结果:
[{ONE:"value", TWO:"value", THREE:"value"}, {ONE:"value", TWO:"value", THREE:"value"}]
toArray()函数返回与您的查询匹配的结构数组,这就是为什么生成的JSON以您想要的方式进行格式化的原因。
[免责声明:我写了Underscore.cfc]