Использовать SerializeJSON для возврата массива структур вместо объекта JSON с узлами COLUMNS и DATA? - PullRequest
2 голосов
/ 28 июля 2010

Я создаю приложение Railo, которое работает с большим количеством данных JSON, отправляемых туда и обратно через Ajax. Я нашел возможность оптимизировать его производительность, но я хотел бы услышать несколько советов от сообщества, прежде чем я займусь этим.

Вот хороший пример ситуации.

У меня есть действие на сервере, которое запрашивает набор ответов на заявки, сериализует их в 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;
});
};

Это хорошо справляется с работой, однако производительность не очень хорошая! Даже с такими быстрыми интерпретаторами js, как в webkit и firefox, эта функция часто составляет 75% времени обработки в функциях. это называется, особенно когда наборы данных большие. Хотелось бы узнать, насколько я мог бы улучшить, перенеся эту обработку на сервер, но у меня не хватает вариантов cfml / cfscript, чтобы написать эффективную версию этого.

То, что мне нужно, чтобы вернуться с сервера, тогда будет выглядеть так:

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

Я понимаю, что формат, используемый SerializeJSON, создает ответы, которые намного меньше и, следовательно, используют меньшую пропускную способность для отправки. Вот тут-то и начинаются эксперименты. Мне бы хотелось посмотреть, как это влияет на мое приложение, чтобы делать вещи по-другому!

кто-нибудь написал сериализатор JSON, который может возвращать данные в этом формате?

Ответы [ 3 ]

6 голосов
/ 28 июля 2010

Если вам нужен массив структур в JS, вы можете легко преобразовать запрос в этот тип набора данных на стороне сервера и применить SerializeJSON ().

Быстрый пример 1

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

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

(I love синтаксис определения свободы структуры в 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>

Должно работать на вас.

2 голосов
/ 12 августа 2012

В Coldfusion 10 или Railo 4 вы можете использовать функцию toArray () из библиотеки Underscore.cfc , чтобы преобразовать ваш запрос в нужный формат перед вызовом 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]

2 голосов
/ 28 июля 2010

eval следует использовать только в очень редких случаях, и это определенно не один из них.Прекратите использовать eval и сделайте это вместо этого:

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

В JavaScript foo['bar'] эквивалентно foo.bar.

...