编辑 3 对于 Coldfusion 9.0 存在以下问题,更新到 9.0.1 确实解决了这个问题

我有一个使用 SerializeJSON 对查询结果进行编码的应用程序:

#SerializeJSON('Ok works fine')#

不幸的是,它修剪了数字的尾随零:
#SerializeJSON(12345.50)#

手动如果我要将相同的值设为字符串,则会发生同样的事情
#SerializeJSON('12345.50')#

我怎样才能防止这种情况发生?

编辑 - 我的场景细节

数据库 (Oracle) 将这些示例值存储在一行中
  • benefactor_id : 0000729789 varchar2(10)
  • life_gift_credit_amt : 12345.50 number(14,2)

  • 当我使用 Coldfusion 9.0.1 (cfscript 如果重要) 查询时,这是一个 RC 转储,请注意 id 字符串保留前导零,但数字列已删除尾随零。

    虽然这很有趣,但对于原始问题并不重要,因为我可以手动创建查询以保留像下面这样的尾随零,但它仍然会在 serializeJSON 中丢失

    我获取查询结果,并使用 serializeJSON 对值进行编码。 JSON 由 jquery 数据表 ajax 使用。请注意,id 字符串已成为一个数字,并添加了 Miguel-F 提到的“.0”
    <cfscript>
    ...
      rc.sql = q.setsql;
      rc.qResult = q.execute().getresult();
    
      savecontent variable="rc.aaData" {
        for (i=1; i <= rc.qResult.RecordCount; i++) {
          writeOutput('{');
          for (col=1; col <= iColumnsLen; col++) {
            // the following line contains a conditional specific to this example
            writeOutput('"#aColumns[col]#":#SerializeJSON(rc.qResult[aColumns[col]][i])#');
            //former statement, discarded due to not being able to handle apostrophe's ... writeOutput('"#jsStringFormat(rc.qResult[aColumns[col]][i])#"');
            writeOutput((col NEQ iColumnsLen) ? ',' : '');
          }
          writeOutput('}');
          writeOutput((i NEQ rc.qResult.RecordCount) ? ',' : '');
        }
      };
    </cfscript>
    

    我最初使用 jsStringFormat 而不是 serializeJSON,但是由于注释文本区域包含撇号的 ect,这将返回无效的 JSON
    {
        "sEcho": 1,
        "iTotalRecords": 65970,
        "iTotalDisplayRecords": 7657,
        "aaData": [
            {
                "nd_event_id": 525,
                "benefactor_id": 729789.0,
                "seq_number": 182163,
                "life_gift_credit_amt": 12345.5,
                "qty_requested": 2,
                "b_a_comment": "#swap",
                "pref_mail_name": "Jay P. Rizzi"
            }
        ]
    }
    

    编辑 2

    快速旁注,如果我将序列化行更改为
    writeOutput('"#aColumns[col]#": "#SerializeJSON(rc.qResult[aColumns[col]][i])#"');
    

    然后我的结果集更改为在双引号中放置记录,但也是双双引号字符串,同时仍然删除尾随零;它让我相信 serializeJSON 正在将值转换为类型?
    "aaData": [
        {
            "nd_event_id": "525",
            "benefactor_id": "729789.0",
            "seq_number": "182163",
            "life_gift_credit_amt": "12345.5",
            "qty_requested": "2",
            "b_a_comment": ""#swap"",
            "pref_mail_name": ""JayP.Rizzi""
        },
    

    最佳答案

    摘自评论

    这个问题的原始海报 (OP) 最初报告说他们在 ColdFusion 9.0.1 中遇到了这个问题。事实证明,他们实际上运行的是 ColdFusion 9.0.0。这很重要,因为 Adob​​e 在 9.0.1 版本中对 SerializeJSON() 函数处理数字的方式进行了更改。当服务器升级到版本 9.0.1 时,这些问题得到解决。

    Raymond Camden 的这篇博文讨论了 9.0.1 中所做的更改 - Not happy with the CF901 JSON Changes?

    在该博客文章中,他引用了错误 83638,该错误已在 9.0.1 版的 HotFix 1 中输入并修复 - Cumulative Hotfix 1 (CHF1) for ColdFusion 9.0.1

    如果您在 BugBase 中搜索版本 9.0.1 下的 JSON,则有几个报告与 OP 相同的问题。

    那些报告的错误还提到了 OP 最初没有报告的另一个问题,即 .0 也被附加到整数。后来在讨论中,OP 确认他们也看到了这种行为。这导致他们验证正在使用的 ColdFusion 版本,发现它不是 9.0.1。

    关于json - 如何确保 SerializeJSON 保持尾随/前导零?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16679118/

    10-10 23:14