Как использовать jsonutil с coldfusion7 и jquery ajax?
Я пытаюсь понять, как использовать JSONutil для сериализации / десериализации JSON между jquery и coldfusion. Я застрял с Coldfusion 7, поэтому я не могу использовать returnformat='json'
атрибут в моем CFC.
client.cfc:
<cfcomponent>
<cffunction name="GetClientsByName"
returntype="query"
hint="get clients from search term">
<cfargument name="name" type="string" required="yes">
<cfquery name="GetClientsByName" datasource="#application.dsn#">
SELECT client_id, client_name
FROM Clients
WHERE client_name LIKE '%' + <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.name#"> + '%'
</cfquery>
<cfreturn GetClientsByName>
</cffunction>
</cfcomponent>
JQuery AJAX вызова:
function getClients(name){
$.ajax {
type: "post"
url: "/surveymanagement/admin/client.cfc",
dataType: "json",
data: {
method: "GetClientsByName",
name: name
},
success: function(data){
$("#here").html(data)
}
}
Теперь, где и как я могу использовать jsonutil, чтобы заставить это работать?
Сайт для jsonutil: http://jsonutil.riaforge.org/
2 ответа
(Краткое примечание, мой совет - сначала настройте cfc отдельно. Отладить проблемы с CF таким способом намного проще. Не добавляйте jquery в смесь, пока вы не подтвердите, что cfc возвращает нужную строку JSON. Но вернемся к вашему вопросу...)
Утилита проста в использовании. Внутри вашей функции создайте ее экземпляр. Затем передайте объект запроса в serializeJSON()
, Наконец, верните полученную строку.
Обратите внимание, что ваша подпись функции должна поддерживать удаленный доступ и возвращать строку (не запрос)
<cffunction name="GetClientsByName" access="remote" returntype="string">
<cfargument name="name" type="string" required="yes">
<!--- always localize function variables --->
<cfset var util = createObject("component", "path.to.JSONUtil")>
<cfset var getClientsByName = "">
.... run cfquery .....
<!--- return JSON string --->
<cfreturn util.serializeJSON(getClientsByName)>
</cffunction>
Вы можете проверить CFC непосредственно в вашем браузере (или с cfinvoke
):
http://localhost/path/to/client.cfc?method=getClientsByName&name=foo
Тем не менее, нативное представление запросов немного неудобно для ИМО. Как упоминал Ланс, вы можете вместо этого вернуть массив структур, который является более стандартным.
<cfset var results = arrayNew(1)>
<cfset var elem = "">
... run query ...
<cfloop query="getClientsByName">
<cfset elem = structNew()>
<cfset elem["client_id"] = getClientsByName.client_id>
<cfset elem["client_name"] = getClientsByName.client_name>
<cfset arrayAppend(results, elem)>
</cfloop>
<cfreturn util.serializeJSON(results)>
Посмотрите на /questions/30703793/preobrazovanie-vozvraschaemyih-dannyih-ajax-v-json/30703803#30703803 вы можете использовать $getJSON
$.ajax({
dataType: "json",
url: url,
data: data,
success: success
});
Есть также очень полезная статья Бена Наделя о преобразовании запросов в массивы. Поскольку работа с запросами может быть проблемой в json, проще сначала преобразовать их в массив