代码之家  ›  专栏  ›  技术社区  ›  Dan Sorensen

如何强制ColdFusion CFC以字符串形式通过JSON输出数字数据?

  •  4
  • Dan Sorensen  · 技术社区  · 14 年前

    我正在使用jquery.post()调用ColdFusion组件(CFC)。我需要一个整数或字符串表示返回的用于URL的数字。

    {"PAGE":"My Page Title","ID":19382}
    or
    {"PAGE":"My Page Title","ID":"19382"}
    

    相反,我得到的是十进制:

    {"PAGE":"My Page Title","ID":19382.0}
    

    需要更新以下HTML:

    <a href="page.cfm?id=19382" id="pagelink">My Page Title</a>
    

    从概念上讲,我认为有多种答案:

    1)我可以用jquery抓取小数点左边的数字。

    2)我可以强制ColdFusion将数字作为字符串发送。

    3)我可以生成整个链接服务器端,只需替换整个链接标记html(不是首选答案,但可能是最好的答案)

    有人知道怎么做1或2吗?3更好吗?

    相关的javascript:(未优化)

    $(".link").live('click', function () {
        var $linkID, serviceUrl;
        serviceUrl = "mycfc.cfc?method=getPage";
        $linkID = $(this).attr("rel");
    
        $.post(serviceUrl, { linkid: $linkID }, function (result) { 
            $('#pagelink').val(result.TITLE);
            if (result.FMKEY.length) {
                 // NEED the ID number WITHOUT the .0 at the end
                 $('#pagelink').attr("href") = "page.cfm?id=" + result.ID;
                 $('#pagelink').text(result.TITLE);
            }
        }, "json");
    });
    

    我的CFC:

    <component output="no">
    <cfsetting showdebugoutput="no">
    <cffunction name="getPage" access="remote" returnFormat="JSON" output="no" hint="Looks up a Page Title and ID">
        <cfargument name="linkID" type="string" required="yes">
        <cfset var page = queryNew("id,title")>
        <cfset var result = structNew()>
        <cfquery datasource="myDatasource" name="page">
            SELECT TOP 1 id, title
            FROM pages
            WHERE linkID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.linkID#">     
        </cfquery>
        <cfif page.recordcount>
            <cfset result.id = page.id>
            <cfset result.title = page.title>
        </cfif>
        <cfreturn result>
    </cffunction>
    </component>
    
    5 回复  |  直到 14 年前
        1
  •  4
  •   orangepips 111111    14 年前

    使用 parseInt() 在JS中。有点喜欢你的解决方案1,但这比你想象的要容易。

    $('#pagelink').attr("href") = "page.cfm?id=" + parseInt(result.ID, 10);
    

    在默认情况下,CF将123这样的任何整数序列化为“123.0”,但在JS或CF这样的无类型语言中,这通常并不重要。

    的默认行为 SerializeJSON() (远程函数使用的)不能被重写,但如果您愿意,可以使用www.riaforge.org中的第三方JSON库之一。

    即使你浏览到“something.cfm”?“ID=123”, URL.id 是一个数值,在cf中等于123。虽然您的URL看起来有点奇怪,但如果它发布到CF,它仍然可以工作。

        2
  •  8
  •   Community c0D3l0g1c    7 年前

    这是一个已知的serialijson()bug/特性。见 this answer 可能的解决方法。

        3
  •  1
  •   Pif    12 年前

    顺便提一句,当你想使用解决方案2时,“我可以强制ColdFusion以字符串的形式发送数字”,例如,当你使用一个插件时,它需要字符串如dataTable,而不想触摸客户端代码…

    仅尝试强制表示以下数字的数字或字符串无效:

    Test["caseSensitiveName"] = "#numericString#";
    

    但是增加了一个领先的空间 强制JSON字符串类型:

    Test["caseSensitiveName"] = " #numericString#";
    

    hack hack,但可以派上用场。

        4
  •  0
  •   Jeff Price    14 年前

    2)我可以强制ColdFusion将数字作为字符串发送。

    你在用身份证计算吗?大概不会。就jquery而言,这是一个只包含数字而不是整数的字符串。就这样对待它。

        5
  •  0
  •   enigment    10 年前

    从另一个角度来看,如果您也控制了后端,您可以尝试强制coldfusion将数字序列化为整数,方法是使用javacast(“int”,someintegerthacoldfusion on inksiafloat)。