gpt4 book ai didi

json - 我如何确保 SerializeJSON 保留尾随/前导零?

转载 作者:行者123 更新时间:2023-12-04 23:04:00 24 4
gpt4 key购买 nike

编辑 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 字符串保留前导零,但数字列已删除尾随零。 enter image description here虽然这很有趣,但这对原始问题并不重要,因为我可以手动创建一个查询来保留尾随零,如下所示,它仍然在 serializeJSON 中丢失 enter image description here

我获取查询结果,并使用 serializeJSON 对值进行编码。 JSON 由 jquery Datatables 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,但是由于注释文本区域包含撇号等,这将返回无效的 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""
},

最佳答案

这有点莫名其妙...我也在 CF 9 中进行了测试。不太清楚你在用序列化数据做什么(作为服务传递,在页面上输出等),我整理了一些测试模式。一种可能的解决方案是,如果只是尝试序列化一个 sing 值 - 不要。您实际上可以在不序列化的情况下对您的数值运行反序列化,它所做的只是去除尾随 0。否则,如果您必须序列化单个值并且不想去除尾随 0,请将变量设置为包含引号

<cfset manualserial = '"111.10"'>
<cfdump var="#DeSerializeJson(manualserial)#">

此时你可以使用反序列化并看到它保持 0,输出为 111.10下面是一些额外的测试,因此您可以看到在尝试保留尾随 0 的同时序列化数组时会发生什么……运气不好。然而,当我放弃内置的 CF 序列化并刚刚创建一个序列化字符串时,尾随 0 被保留(请参阅下面 WriteDump 示例中的 var customarr 和 d_customarr)。

希望对您有所帮助。

<cfscript>
/*initial testing*/
string = SerializeJSON('Ok works fine');
numericstring = SerializeJSON('12345.50');
numeric = SerializeJSON(12345.50);
arr = SerializeJSON([12345.50,12345.10,'12345.20']);
arrFormat = SerializeJSON([NumberFormat(12345.50,'.00') & ' ',12345.10,'12345.20']);

d_string = DeSerializeJSON(string);
d_numericstring = DeSerializeJSON(numericstring);
d_numeric = DeSerializeJSON(numeric);
d_arr = DeSerializeJSON(arr);
d_arrFormat = DeSerializeJSON(arrFormat);


/*technically, there is no need to serialize a single string value, as running through DeSerialize just trims the trailing 0
if you need to do so, you would want to pass in as a string with quotation marks*/
customstring = '"12345.50"';
d_customstring = DeSerializeJSON(customstring);
customarr = '["12345.50","12345.10","12345.20"]'; //--you can format your own array instead of using CF to serialize
d_customarr = DeSerializeJSON(customarr);

WriteDump(variables);
</cfscript>

=======附加可能的解决方案b========

我认为手动序列化您的记录可能是最稳定的选择,试试这个例子,如果可行,您应该能够将该函数添加到 cfc 或创建一个 udf 以供重复使用。希望对您有所帮助。

<cfscript>
q = QueryNew('nd_event_id,benefactor_id,seq_number,life_gift_credit_amt,qty_requested,b_a_comment,pref_mail_name',
'Integer,VarChar,Integer,Decimal,Integer,VarChar,VarChar');
r = queryaddrow(q,2);
querysetcell(q, 'nd_event_id', 525, 1);
querysetcell(q, 'benefactor_id', 0000729789, 1);
querysetcell(q, 'seq_number', 182163, 1);
querysetcell(q, 'life_gift_credit_amt', 12345.50, 1);
querysetcell(q, 'qty_requested', 2, 1);
querysetcell(q, 'b_a_comment', '##swap', 1);
querysetcell(q, 'pref_mail_name', 'Jay P. Rizzi', 1);
querysetcell(q, 'nd_event_id', 525, 2);
querysetcell(q, 'benefactor_id', 0000729790, 2);
querysetcell(q, 'seq_number', 182164, 2);
querysetcell(q, 'life_gift_credit_amt', 12345.90, 2);
querysetcell(q, 'qty_requested', 10, 2);
querysetcell(q, 'b_a_comment', '##swap', 2);
querysetcell(q, 'pref_mail_name', 'Jay P. Rizzi', 2);
WriteDump(q);

s = membershipManualSerializer(q);

public string function membershipManualSerializer(required query q){
var jsonString = '{"aaData":[';
var cols = listtoarray(q.columnList,',');

for(var i=1; i lte q.recordcount; i++){

jsonString &= "{";

for(var c=1;c lte arraylen(cols);c++){
jsonString &= '"' & cols[c] & '":"' & q[cols[c]][i] & '"';
jsonString &= (c lt arraylen(cols))? ",":"";
}

jsonString &= (i lt q.recordcount)? "},":"}]";
}

jsonString &="}";

return jsonString;
}


WriteOutput(s);
WriteDump(DeserializeJson(s));
</cfscript>

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com