2010-07-28 8 views
2

저는 Ajax를 통해 많은 JSON 데이터를주고받는 Railo 앱을 만들고 있습니다. 성능을 최적화 할 수있는 기회를 찾았지만 문제를 해결하기 전에 커뮤니티의 조언을 듣고 싶습니다.SerializeJSON을 사용하여 COLUMNS 및 DATA 노드가있는 JSON 객체 대신 구조체 배열을 반환 하시겠습니까?

다음은 좋은 예입니다.

입찰 응답 집합을 쿼리하고이를 JSON에 직렬화 한 다음 프런트 엔드의 자바 스크립트로 반환하여 일부 HTML을 구문 분석하고 렌더링하는 작업을 서버에서 수행합니다.

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

내가 이름 노드 객체의 배열에이 형식을 변환 할 underscore '의지도() 함수를 사용하는 함수를 썼다 : 라일로는 JSON을 반환하는 형식은 친숙한 두 개의 노드 객체입니다

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

이 작업은 매우 편리합니다. 그러나 성능이 좋지 않습니다! 웹킷과 파이어 폭스와 같은 신속한 js 인터프리터를 사용하는 경우에도이 함수는 호출하는 함수에서 처리 시간의 75 %를 차지하는 경우가 많습니다. 특히 데이터 세트가 클 경우 특히 그렇습니다. 이 처리를 서버에 맡김으로써 얼마나 많은 개선이 있었는지보고 싶습니다만, cfml/cfscript를 사용하여이 효율적인 버전을 작성하지 않았습니다.

내가 다시 서버에서 올 필요가있는 무엇, 다음과 같을 것이다 :

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

내가 SerializeJSON에서 사용하는 형식이 훨씬 작고, 따라서 보내 적은 대역폭을 사용하여 응답을 만들고 있음을 이해합니다. 이것은 실험이 들어오는 곳입니다. 나는 그것이 다른 일을하는 나의 어플리케이션에 어떻게 영향을 주는지보고 싶습니다!

이 형식의 데이터를 반환 할 수있는 JSON 직렬기를 작성한 사람이 있습니까?

답변

2

eval은 매우 드문 경우에 한해 사용해야하며 이는 분명히 그 중 하나가 아닙니다. 평가 사용을 중지하고 대신 이렇게 :

자바 스크립트에서
q[columns[i]] = w[i]; 

, foo['bar']foo.bar에 해당합니다.

+0

ack youre right. 나에게 뭐가 문제 니? –

+0

이 수정을 수행하면 toArgsObject()의 성능이 3 배가됩니다. 나는 당황! 호기심에서, 나는 아직도 누군가가 나의 원래 질문에 대한 답을 가지고 있는지 알고 싶다. –

6

JS에서 구조체 배열이 필요한 경우 쿼리를 서버 쪽에서이 유형의 데이터 집합으로 쉽게 변환하고 SerializeJSON()을 적용 할 수 있습니다.

빠른 예 1

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

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

(I 사랑 라일로의 구조 정의 구문의 자유) 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> 

당신을 위해 작동해야

빠른 예 .

2

ColdFusion 10 또는 Railo 4에서는 Underscore.cfc librarytoArray() function을 사용하여 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이 원하는 방식으로 서식이 이유입니다, 쿼리와 일치 구조체의 배열을 반환합니다.

[면책 조항 : Acknowledgement :