Как использовать 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, проще сначала преобразовать их в массив

Другие вопросы по тегам