2010-07-28 16 views
2

Je construis une application Railo qui traite beaucoup de données JSON envoyées par Ajax. J'ai identifié une opportunité d'optimiser sa performance, mais j'aimerais avoir quelques conseils de la communauté avant de m'y attaquer.SerializeJSON est utilisé pour renvoyer un tableau de structures à la place d'un objet JSON avec des nœuds COLUMNS et DATA?

Voici un bon exemple de la situation.

J'ai une action sur le serveur qui interroge un ensemble de réponses d'enchères, les sérialise en JSON, puis les renvoie à mon javascript sur le frontal, qui analyse ensuite et rend du HTML. Le format dans lequel Railo renvoie le JSON est l'objet à deux nœuds familier:

{"COLUMNS":["one","two","three",...],"DATA":["value","value","value",...]} 

j'ai écrit une fonction qui utilise la fonction carte de underscore() pour convertir ce format en un tableau d'objets avec des noeuds nommés:

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

Ceci fait le travail bien, mais les performances ne sont pas très bonnes! Même avec les interprètes js rapides comme ceux de webkit et firefox, cette fonction représente souvent 75% du temps de traitement dans les fonctions qui l'appellent, en particulier lorsque les jeux de données sont volumineux. Je voudrais voir combien d'amélioration j'obtiendrais en déchargeant ce traitement au serveur, mais je n'ai pas tout à fait les côteles de cfml/cfscript pour écrire une version efficace de ceci.

Ce que je dois revenir à partir du serveur, puis, ressemblerait à ceci:

[ 
{"one":"value","two":"value","three":"value"}, 
{"one":"value","two":"value","three":"value"}. 
... 
] 

Je comprends que le format utilisé par SerializeJSON crée des réponses qui sont beaucoup plus petites et donc d'utiliser moins de bande passante pour envoyer. C'est là que l'expérimentation entre en jeu. J'aimerais voir comment cela a un impact sur mon application pour faire les choses différemment!

quelqu'un a écrit un Serializer JSON qui peut retourner des données dans ce format?

Répondre

2

eval ne devrait être utilisé que dans quelques cas très rares et cela n'en fait certainement pas partie. Arrêtez de eval et faire ceci:

q[columns[i]] = w[i]; 

En JavaScript, foo['bar'] est l'équivalent de foo.bar.

+0

Qu'est-ce qui ne va pas chez moi? –

+0

Cette correction a triplé les performances de toArgsObject(). Je suis embarrassé! Par curiosité, cependant, j'aimerais savoir si quelqu'un a une réponse à ma question initiale –

6

Si vous avez besoin d'un tableau de structures dans JS, vous pouvez facilement convertir la requête en ce type de jeu de données côté serveur et appliquer SerializeJSON().

Exemple rapide 1

<cfset dataset = [ 
    {"one":"value","two":"value","three":"value"}, 
    {"one":"value","two":"value","three":"value"} 
] /> 

<cfoutput><p>#SerializeJSON(dataset)#</p></cfoutput> 

(I amour la liberté de la syntaxe de définition de structure Railo)

exemple rapide 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> 

devrait fonctionner pour vous .

2

Dans Coldfusion 10 ou Railo 4, vous pouvez utiliser le toArray() function du Underscore.cfc library pour convertir votre requête au format souhaité avant d'appeler serializeJSON(). Exemple dans cfscript:

exampleQuery = queryNew("one,two,three","Varchar,Varchar,Varchar", 
[ 
    ["value","value","value"], 
    ["value","value","value"] 
]); 

arrayOfStructs = _.toArray(exampleQuery); 

serializeJSON(arrayOfStructs); 

Résultat:

[{ONE:"value", TWO:"value", THREE:"value"}, {ONE:"value", TWO:"value", THREE:"value"}] 

La fonction toArray() retourne un tableau de struct qui correspond à votre requête, ce qui explique pourquoi le JSON résultant est formaté de la manière que vous voulez. [Disclaimer: J'ai écrit Underscore.cfc]