EDIT 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 数値(14,2)
Coldfusion 9.0.1 (問題がある場合は cfscript) を使用してクエリを実行すると、RC ダンプが表示されます。id 文字列には先頭のゼロが保持されていますが、数値列では末尾のゼロが削除されていることに注意してください。 それは興味深いことですが、以下のようにクエリを手動で作成して末尾のゼロを保持できるため、元の問題には関係ありませんが、serializeJSON で失われます。
クエリ結果を取得し、serializeJSON を使用して値をエンコードします。JSON は jquery Datatables ajax によって消費されます。Miguel-F が言及したように、id 文字列が数値になり、「.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>
私はもともとシリアライズJSONの代わりにjsStringFormatを使用していましたが、コメントテキスト領域にアポストロフィの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""
},