【问题标题】:Error with JSON results from a cfc file for JQUERY来自 JQUERY 的 cfc 文件的 JSON 结果错误
【发布时间】:2015-09-18 08:53:27
【问题描述】:

我正在尝试将 JQUERY 与 Coldfusion 一起使用。我想从 cfc 文件中的函数以 JSON 格式从数据库中检索结果。我需要使用几个查询手动创建 json:

<cfcomponent output="false">
    <cffunction name="getTransports" access="remote" returnformat="JSON" output="false">
        <cfargument name="CITY_TO" type="string" required="yes">  
        <cfargument name="CITY_FROM" type="string" required="yes"> 

        <cfquery name ="transport" datasource="#application.datasource#">
        <!---Query Transports--->
            select * from TRANSPORTS
        </cfquery>

        <cfset transports = arrayNew(1)>

        <cfloop from="1" to="#transport.recordcount#" index="i">   

            <cfquery name="defined_transport" datasource="#application.datasource#">
                select * from TABLE_FRAIS 
                where CITY_TO = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.CITY_TO#">
                and CITY_FROM = <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.CITY_FROM#">
                and CTRP_ST_CODE = '#transport.TRANSPORT_CODE#' 
            </cfquery>

            <cfif defined_transport.recordCount eq 0>
                <cfset transport_value = "#transport.TRANSPORT_NAME# (not defined)">
            <cfelse>  
                <cfset transport_value = "#transport.TRANSPORT_NAME#">
            </cfif>

            <cfset transpVO = structNew() />

            <cfset transpVO['ID']= #transport.TRANSPORT_CODE# />            
            <cfset transpVO['VALUE']= #transport_value# />      
            <cfset transports[i] = transpVO />
        </cfloop>

        <cfreturn transports>       

    </cffunction>

</cfcomponent>

当我在 JQUERY 脚本中检索结果时,我得到一个字符串 JSON:

[ { "ID" : "APEX",
    "VALUE" : "Apex (not defined)"
  },
  { "ID" : "AVI",
    "VALUE" : "Plane (not defined)"
  },
  { "ID" : "TRAIN 1",
    "VALUE" : "Train 1st class"
  },
  { "ID" : "VOIT",
    "VALUE" : "Car"
  },
  { "ID" : "ZERO",
    "VALUE" : "Cost 0 (not defined)"
  }
]

编辑:

这里是我的 JQUERY 脚本,用于通过 Coldfusion 检索数据:

$().ready(function() {
     $.ajax({
        type:   'GET',
        url:    'transports.cfc',
        data: {
            method:     'getTransports',
            CITY_TO:    'LUX',
            CITY_FROM:  'UWP'
        },
        dataType: "application/json",  //this is important      responsetype:'JSON',

        success: function(result) {
            var select = $("##transp");
            select.empty();
            select.append(
                new Option('Select transport', '-1')
            );
            console.log(result); // display the JSON
            console.log(result.length); // displays 252
        },
        error: function(xhr, message) {
            alert('ajax request failed');
            console.log(xhr, message);
        }
     });
}); 

结果显示在控制台中,如果我不知道如何填充下拉列表。我试着补充一下:

        select.append(
            new Option(item.ID, item.VALUE)
        );

我在没有文本的下拉列表中获得 252 行。

但我正在尝试使用它来填充下拉列表,但我做不到。

你能告诉我我的coldfusion函数和我的JSON结果是否正常吗?

问候,

【问题讨论】:

  • 您的 JSON 结果似乎没问题(在jsonlint.com 中有效)。当您尝试填充下拉列表时不会出现问题吗?你没有解释为什么你不能这样做。
  • 我在帖子中添加了JQUERY代码。

标签: jquery json ajax coldfusion-10


【解决方案1】:

看来问题出在您的脚本上。您应该尝试使用循环一次添加一个选项:

var select = $("#transp");
select.empty();
select.append(
    new Option('Select transport', '-1')
);
for(var i=0; i<result.length; i++){
    select.append(
      new Option(result[i].ID, result[i].VALUE)
    );
}

这是一个有效的 sn-p:http://jsfiddle.net/odp3dve8/1/

//oResult simulates the AJAX result :
var oResult = [ { "ID" : "APEX",
    "VALUE" : "Apex (not defined)"
  },
  { "ID" : "AVI",
    "VALUE" : "Plane (not defined)"
  },
  { "ID" : "TRAIN 1",
    "VALUE" : "Train 1st class"
  },
  { "ID" : "VOIT",
    "VALUE" : "Car"
  },
  { "ID" : "ZERO",
    "VALUE" : "Cost 0 (not defined)"
  }
];


var select = $("#transp");
select.empty();
select.append(
    new Option('Select transport', '-1')
);
//Loop on each element of the JSON result and add each option.
for(var i=0; i<oResult.length; i++){
   	select.append(
      new Option(oResult[i].ID, oResult[i].VALUE)
    );
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<select id="transp">
    <option value="1">Fake option 1</option>
    <option value="2">Fake option 2</option>
</select>

编辑。 对于字符串/json问题,您可以尝试更新您的请求参数“headers”和“datatype”:

$.ajax({
    type:   'GET',
    url:    'transports.cfc',
    data: { ... },

    headers: {'Accept': "application/json"},
    dataType: "json",


    success: function(result) { ... }
    error: function(result) { ... }
});

如果这不起作用,您可能会对这篇文章感兴趣: http://blog.tcs.de/coldfusion-query-to-javascript-object/

【讨论】:

  • 显然你的脚本有效,但在我的代码中它不起作用。我确定这是内容类型的问题。在 jquery 中,结果 JSON 被视为字符串,这就是为什么 console.log(result.length) 显示 252 ...在 firebug 中,我可以在 XHR 请求中看到: header response - content-Type: text/html;字符集=UTF-8。你知道怎么解决吗??
  • 不幸的是,当我添加标题时它仍然是一样的:{'Accept': "application/json"},...如果我替换 dataType: "application/json", 通过 dataType: "json " 我直接进入错误函数。
  • 那么您的 Coldfusion 响应很可能不在 JSON 中,尽管属性“returnformat='JSON'”。由于我的 cfc 知识不是很好,我无法为您提供更多帮助。
  • 而且如果没有查出来,仍然可以使用 parseJSON() 将字符串转换为 JSON 对象。这不是最好的解决方案,但它应该有效。 api.jquery.com/jquery.parsejson
  • 嗨,这仍然是同一个问题。但实际上,当我尝试执行 console.log(result) 时,我已经看到: [{"VALUE":"Apex (not defined)","ID" :"APEX"},{"VALUE":"Plane (not defined)","ID":"AVI"},{"VALUE":"Train 1st class","ID":"TRAIN 1"},{ "VALUE":"Car","ID":"VOIT"},{"VALUE":"Cost 0 (not defined)","ID":"ZERO"}] 你知道吗
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2019-05-28
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多