Jquery $.ajax ColdFusion cfc JSON Hello World

Jquery $.ajax ColdFusion cfc JSON Hello World,jquery,json,coldfusion,cfc,Jquery,Json,Coldfusion,Cfc,我已经尽可能地简化了这个例子。我有一个遥控功能: <cfcomponent output="false"> <cffunction name="Read" access="remote" output="false"> <cfset var local = {}> <cfquery name="local.qry" datasource="myDatasource"> SELECT PersonID,FirstName,L

我已经尽可能地简化了这个例子。我有一个遥控功能:

<cfcomponent output="false">
<cffunction name="Read" access="remote" output="false">
    <cfset var local = {}>

    <cfquery name="local.qry" datasource="myDatasource">
    SELECT PersonID,FirstName,LastName FROM Person
    </cfquery>
    <cfreturn local.qry>
</cffunction>
</cfcomponent>
使用jQuery$.ajax方法,我想创建一个无序的每个人的列表

    <!DOCTYPE HTML>
    <html>
    <head>
    <script src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
    google.load("jquery", "1");
    </script>
    <script type="text/javascript">
    jQuery(function($){
    $.ajax({
            url: "Remote/Person.cfc?method=Read&ReturnFormat=json",
            success: function(data){
                var str = '<ul>';
// This is where I need help:
                for (var I=0; I<data.length; I++) {
                    str += '<li>' + I + data[I][1]+ '</li>'
                }
                str += '</ul>';
                $('body').html(str);
            },
            error: function(ErrorMsg){
               console.log("Error");
            }
        });
    });
    </script>
    </head>
    <body>
    </body>
    </html>
我丢失的部分是在数据上循环。 我更喜欢使用jQuery$.ajax方法,因为我知道$.get和$.post没有错误捕获


我不知道如何处理从cfc返回的JSON。

我不太熟悉ColdFusion,但您是否尝试过将数据类型设置为JSON

$.ajax({
    url: 'Remote/Person.cfc?method=Read&ReturnFormat=json',
    dataType: 'json',
    success: function(response) {
        var data = response.DATA;
        var str = '<ul>';

        for (var I = 0; I < data.length; I++) {
            str += '<li>' + I + data[I][1] + '</li>';
        }

        str += '</ul>';

        $('body').html(str);
    },
    error: function(ErrorMsg) {
       console.log('Error');
    }
});
如果上述方法不起作用,如果您可以显示请求返回的原始JSON数据,我应该能够轻松地修复它


另外,不确定它是否在代码中,但在for循环的行末尾漏掉了一个分号。

我不太熟悉ColdFusion,但您是否尝试过将数据类型设置为JSON

$.ajax({
    url: 'Remote/Person.cfc?method=Read&ReturnFormat=json',
    dataType: 'json',
    success: function(response) {
        var data = response.DATA;
        var str = '<ul>';

        for (var I = 0; I < data.length; I++) {
            str += '<li>' + I + data[I][1] + '</li>';
        }

        str += '</ul>';

        $('body').html(str);
    },
    error: function(ErrorMsg) {
       console.log('Error');
    }
});
如果上述方法不起作用,如果您可以显示请求返回的原始JSON数据,我应该能够轻松地修复它


另外,不确定它是否在代码中,但在for循环的行末尾漏掉了一个分号。

最简单的方法是直观地查看返回的JSON数据的结构。那么横穿JS对象应该不会太难。你试过JSON可视化吗

如果您只需要PersonID,那么也可以从CF返回PersonID的数组或列表


或者,您可以要求CF返回纯文本,并生成所有的。通过ajax传递的消息会更大,但需要维护的JS代码会更少。CFML更容易维护,对吗

最简单的方法是直观地查看返回的JSON数据的结构。那么横穿JS对象应该不会太难。你试过JSON可视化吗

如果您只需要PersonID,那么也可以从CF返回PersonID的数组或列表

或者,您可以要求CF返回纯文本,并生成所有的。通过ajax传递的消息会更大,但需要维护的JS代码会更少。CFML更容易维护,对吗

选项:

在你的情况下,我会

<cffunction name="keywordAutoComplete" access="remote" 
            returntype="struct" returnformat="JSON" >
但是

这与returntype=string returnformat=plain+ 从jQuery的角度来看,这是一个问题,因为即使使用按列序列化JSON,也会得到难看的JSON

您可以通过cfloop和连接手动生成JSON字符串:/ 使用覆盖序列化JSON的cfjson.cfc 转到Ben Nadel的站点,使用他的toJSON方法,并以某种方式修改它以满足您的需要 另一件事是序列化JSON,返回大写键,所以请注意,使用lcase或write.LIKETHIS在js中

PS:在jQuery中尝试动态创建html:

var someLiElement = $('<li />').addClass('custom_class')
                 .text('Foo bar')
                 .attr('id', 'custom_id' + someInteger)
然后将方法附加到父元素

选项:

在你的情况下,我会

<cffunction name="keywordAutoComplete" access="remote" 
            returntype="struct" returnformat="JSON" >
但是

这与returntype=string returnformat=plain+ 从jQuery的角度来看,这是一个问题,因为即使使用按列序列化JSON,也会得到难看的JSON

您可以通过cfloop和连接手动生成JSON字符串:/ 使用覆盖序列化JSON的cfjson.cfc 转到Ben Nadel的站点,使用他的toJSON方法,并以某种方式修改它以满足您的需要 另一件事是序列化JSON,返回大写键,所以请注意,使用lcase或write.LIKETHIS在js中

PS:在jQuery中尝试动态创建html:

var someLiElement = $('<li />').addClass('custom_class')
                 .text('Foo bar')
                 .attr('id', 'custom_id' + someInteger)

然后将append方法附加到父元素

看起来结果是json格式的检查文档。 如果指定returnformat=json,并且函数返回查询,则ColdFusion会将查询序列化为一个json对象,其中包含两个条目、一个列名数组和一个列数据数组数组。有关更多信息,请参见序列化JSON

因此,第一个arraydata.COLUMNS应该是一个列名数组。data.COLUMNS[0]将为您提供第一列的名称。data.data[0]将为您提供查询的第一行

一个很好的技巧是在chrome或firebug控制台中使用console.logdata以结构化形式查看数据

我没有测试这个,但应该很接近。只是从数据中生成一个基本表

$.ajax({
    url: 'Remote/Person.cfc?method=Read&ReturnFormat=json',
    dataType: 'json',
    success: function(response) {
        var str = '<table><tr>';
        var i;
        var j;

        //loop over each column name for headers
        for (i = 0; i < response.COLUMNS.length; i++) {
              str += '<th>' + response.COLUMNS[i] + '</th>';
          }
        }
        str += '</tr>';

        //loop over each row
        for (i = 0; i < response.DATA.length; i++) {
          str += '<tr>';
          //loop over each column
          for (j = 0; j < response.DATA[i].length; j++) {
              str += '<td>' + response.DATA[i][j] + '</td>';
          }
          str += '</tr>';
        }
        str += '</table>';

        $('body').html(str);
    },
    error: function(ErrorMsg) {
       console.log('Error');
    }
});

看起来结果是json格式的检查文档。 如果指定returnformat=json,并且函数返回查询,则ColdFusion会将查询序列化为一个json对象,其中包含两个条目、一个列名数组和一个列数据数组数组。有关更多信息,请参见序列化JSON

因此,第一个arraydata.COLUMNS应该是一个列名数组。data.COLUMNS[0]将为您提供第一列的名称。data.data[0]将为您提供查询的第一行

一个很好的技巧是在chrome或firebug控制台中使用console.logdata以结构化形式查看数据

我没有测试这个,但应该很接近。只是从数据中生成一个基本表

$.ajax({
    url: 'Remote/Person.cfc?method=Read&ReturnFormat=json',
    dataType: 'json',
    success: function(response) {
        var str = '<table><tr>';
        var i;
        var j;

        //loop over each column name for headers
        for (i = 0; i < response.COLUMNS.length; i++) {
              str += '<th>' + response.COLUMNS[i] + '</th>';
          }
        }
        str += '</tr>';

        //loop over each row
        for (i = 0; i < response.DATA.length; i++) {
          str += '<tr>';
          //loop over each column
          for (j = 0; j < response.DATA[i].length; j++) {
              str += '<td>' + response.DATA[i][j] + '</td>';
          }
          str += '</tr>';
        }
        str += '</table>';

        $('body').html(str);
    },
    error: function(ErrorMsg) {
       console.log('Error');
    }
});

@anomareh[[PersonID1]、[FirstName1]、[LastName1],
['PeronID2'、'FirstName2'、'LastName2']]。。不是JSON,它是一个带漂亮括号的字符串;我反对双引号:p@anomareh[['PersonID1'、'FirstName1'、'LastName1']、['PeronID2'、'FirstName2'、'LastName2']]。。不是JSON,它是一个带漂亮括号的字符串;我有一件事反对双引号:感谢你抓住了丢失的分号。我得到的数据是:{COLUMNS:[PERSONID,FIRSTNAME,LASTNAME],数据:[[1001,Scott,Wimmer],[1002,Phillip,Senn],[1003,Paul,Nielsen]}另外,我不知道为什么,但是现在正在执行错误条件,而不是成功条件。@cf_Phillipsen尝试我的编辑。如果它仍然执行错误条件console.logErrorMsg而不是字符串,请告诉我错误是什么。感谢您捕获缺少的分号。我得到的数据是:{COLUMNS:[PERSONID,FIRSTNAME,LASTNAME],数据:[[1001,Scott,Wimmer],[1002,Phillip,Senn],[1003,Paul,Nielsen]}另外,我不知道为什么,但是现在正在执行错误条件,而不是成功条件。@cf_Phillipsen尝试我的编辑。如果它仍在执行错误条件console.logErrorMsg而不是字符串,请告诉我错误是什么。感谢您帮助我意识到数据是大写的,我错过了。你的答案也有同样的问题。var数据=响应数据;应为var data=response.data;此外,您的for循环也被弄乱了。第一列应该是response.COLUMNS.length和response.COLUMNS[i]以及第二列和第三列应该分别是data.length和data[i].length和data[i][j]。我以为参数是数据,忘记了重新分配。所以,我只是将数据更改为response,并删除了data=response.data。感谢您帮助我意识到数据是大写的,但我忽略了这一点。你的答案也有同样的问题。var数据=响应数据;应为var data=response.data;此外,您的for循环也被弄乱了。第一列应该是response.COLUMNS.length和response.COLUMNS[i]以及第二列和第三列应该分别是data.length和data[i].length和data[i][j]。我以为参数是数据,忘记了重新分配。所以,我只是将数据更改为response,并删除了data=response.data。