如何解析ColdFusion CFC的JSON返回?

时间:2014-06-05 20:00:45

标签: jquery ajax json coldfusion cfc

我已经简化了这段代码,以便于解释。

我有一个cfm页面,用户点击表格行并获取ID。我想将该ID发送到CFC,在那里运行查询,并将结果返回到cfm页面。

这是JQuery的样子。

$.ajax({
    url: "test.cfc?method=testFunction",
    data: {ID:123456},
    success: function(response) {
        $("#div1").html(response);
    }
});

以及cfc的样子。

<cfcomponent>
    <cffunction name="testFunction" access="remote" returnType="query" returnFormat="JSON">
           <cfquery name="testQuery" datasource="x">
                Select ID, NAME
                From Table
                Where ID = '#url.ID#'   
            </cfquery>

            <cfreturn testQuery>
    </cffunction>
</cfcomponent>

编辑 - 替代CFC方法

<cffunction name="testFunction" access="remote">
    <cfquery name="testQuery" datasource="x">
                Select ID, NAME
                From Table
                Where ID = '#url.ID#'   
            </cfquery>

    <cfset response = [] />

    <cfoutput query="testQuery">
        <cfset obj = {
            "ID" = ID,
            "NAME" = NAME               
         } />
        <cfset arrayAppend(response, obj) />
    </cfoutput>

    <cfprocessingdirective suppresswhitespace="Yes"> 
        <cfoutput>
            #serializeJSON(response)#
        </cfoutput>
    </cfprocessingdirective>

    <cfsetting enablecfoutputonly="No" showdebugoutput="No">
</cffunction>

由于顶部的ajax调用中的成功函数显示,div1将填充JSON响应,如下所示。

{"COLUMNS":["ID","NAME"],"DATA":[[123456,"John"]]}

编辑 - 替代响应

[{"ID":123456,"NAME":"John"}]   

接下来我希望能够在我页面的某个地方使用和输出该JSON响应中的数据。我怎样才能做到这一点?我很难理解解析这些数据。 我主要关注的是从数组格式中获取这些数据,以便将其输出到页面中的表单字段中。

3 个答案:

答案 0 :(得分:1)

CF11:支持,请参阅doc中的serialization.serializeQueryAs

CF10或以下:返回queryToArray(testQuery),不要忘记更改testQuery

private function queryToArray(q) {
    var s = [];
    var cols = q.columnList;
    var colsLen = listLen(cols);
    for(var i=1; i<=q.recordCount; i++) {
        var row = {};
        for(var k=1; k<=colsLen; k++) {
            row[lcase(listGetAt(cols, k))] = q[listGetAt(cols, k)][i];
        }
        arrayAppend(s, row);
    }
    return s;
}

参考http://www.raymondcamden.com/index.cfm/2014/5/8/ColdFusion-11s-new-Struct-format-for-JSON-and-how-to-use-it-in-ColdFusion-10

或者,使用:https://github.com/cutterbl/serializeCFJSON使用Javascript解析客户端的CF查询数据集。

答案 1 :(得分:1)

我想出了最好的方法。

  1. 让cfc仅使用大括号返回查询结果,而不是带括号的数组。

    <cfcomponent>
        <cffunction name="testFunction" access="remote">
             <cfquery name="testQuery" datasource="x">
                 Select ID, NAME
                 From Table
                 Where ID = '#url.ID#'   
             </cfquery>
    
        <cfoutput query="testQuery">
            <cfset obj = {
                "ID" = ID,
                "NAME" = NAME               
             } />
        </cfoutput>
    
        <cfprocessingdirective suppresswhitespace="Yes"> 
            <cfoutput>
                #serializeJSON(obj)#
            </cfoutput>
        </cfprocessingdirective>
    
        <cfsetting enablecfoutputonly="No" showdebugoutput="No">
    </cffunction>
    
    1. JQuery看起来像这样

      $.ajax ({
          //location of the cfc
          url: "test.cfc",
          //function name and url variables to send
          data: {method:'functioname', ID:ID},
          //function run on success can the returned json object and split it out each field to a form field.  Here I'm just showing one field in the alert.
          success: function(obj) {
               var parsedjson = $.parseJSON(obj);
               alert(parsedjson.ID);
          }
      });
      

答案 2 :(得分:0)

(评论太长)

简化和巩固代码的一些改进

  1. 不需要cfoutputcfsetting以及函数内部。只需返回原始结构&#34;按原样#34;。要自动将响应转换为JSON,只需将URL参数?returnformat=json附加到您的ajax调用

  2. dataType: "json"添加到您的ajax调用中,jQuery会自动将响应解析为JSON对象

  3. 不要忘记使用VARLOCAL

  4. 本地化所有函数局部变量
  5. 通常,您希望避免直接从函数中访问URL范围。而是将ID定义为参数。然后在查询中引用ARGUMENTS.ID而不是URL.ID

  6. <强>的jQuery

            $.ajax({
                type: "GET",
                url: "test.cfc",
                // return the result as JSON
                data: {method: "testFunction", ID:someID, returnFormat: "JSON"},
                // automatically parse JSON response 
                dataType: "json", 
                success: function (response) {
                    // check RECORDCOUNT to determine if ID was found
                    alert("ID="+ response.ID);
                },
                error: function (request, status, error)
                {
                    // do something if call fails..
                    alert(error); 
                }
            });
    

    <强> CFC:

        <cfcomponent>
            <cffunction name="testFunction" access="remote" returntype="struct">
                <cfargument name="ID" type="string" required="true">
    
                <cfquery name="LOCAL.testQuery" datasource="x">
                     Select ID, NAME
                     From Table
                     Where ID = <cfqueryparam value="#arguments.ID#" cfsqltype="cf_sql_varchar">
                </cfquery>
    
                <!--- note, this assumes the query only ever returns 0 or 1 record --->
                <cfset Local.obj = { recordCount=testQuery.recordCount, ID=testQuery.ID, Name=testQuery.Name }>
    
                <cfreturn Local.obj>
            </cffunction>
        </cfcomponent>