jsStringFormat() 和带有 JSON 的撇号

Posted

技术标签:

【中文标题】jsStringFormat() 和带有 JSON 的撇号【英文标题】:jsStringFormat() and apostrophe with JSON 【发布时间】:2011-12-01 21:05:03 【问题描述】:

因此,当我尝试转义 JSON 的特殊字符时,jsStringFormat() 遇到了一个有趣的问题。我正在使用 jQuery 数据表插件并对 Coldfusion 进行 AJAX 调用。

似乎正在发生的事情是 jsStringFormat() 正在转义撇号字符并将 \' 放入我的 JSON 中。根据 JSON 规范,单撇号不需要转义,因此会中断。

这是我的 JSON 返回示例


    "sEcho": 2,
    "iTotalRecords": 659,
    "iTotalDisplayRecords": 201,
    "aaData": [

        ["516", "", "54d 7h 12m", "02- Revenue", "", "Assist in validating error in JCA provided Discount Commission report", "Received", "Work Request", "Jan 1, 2012"],
        ["616", "", "16d 7h 12m", "02- Revenue", "", "Order/Install new POS Terminal at Katie\'s Workstation", "In Progress", "Work Request", "Oct 31, 2011"],
        ["617", "", "15d 7h 12m", "02- Revenue", "", "Replace #6081 POS Printer at Kim\'s Desk", "Received", "Work Request", "Oct 31, 2011"]
    ]

您可以清楚地看到描述中插入的\'

我真的需要找到一种方法来防止jsStringFormat() 转义撇号。


更新

到目前为止,有这段代码用于尝试填充 aaData 数组。现在我只得到逗号,所以我知道它的循环正确,但没有在正确的地方填充数据。

所有这些都是基于数据表coldfusion数据源代码http://www.datatables.net/development/server-side/coldfusion

<cfcontent reset="Yes" />

<cfset aaData = [] />
<cfset datasetRecords = [] />
<cfloop query="qFiltered" startrow="#val(url.iDisplayStart+1)#" endrow="#val(url.iDisplayLength)#">
<cfif currentRow gt (url.iDisplayStart+1)>,</cfif>
        <cfloop list="#listColumns#" index="thisColumn">
            <cfif thisColumn neq listFirst(listColumns)>,</cfif>
                <cfif thisColumn is "version">
                    <cfif version eq 0>"-"
                    <cfelse><cfset datasetData["#version#"] />
                    </cfif>
                <cfelse><cfset datasetData[""] = qFiltered[thisColumn][qFiltered.currentRow] />
                </cfif>
                <cfset ArrayAppend(datasetRecords, datasetData ) />
        </cfloop>
<cfset ArrayAppend(datasetRecords, aaData ) />
</cfloop>

<cfset record =  />
<cfset record["sEcho"] = val(url.sEcho) />
<cfset record["iTotalRecords"] = qCount.total />
<cfset record["iTotalDisplayRecords"] = qFiltered.recordCount />
<cfset record["aaData"] = aaData />

<cfoutput><cfdump var="#record#"></cfoutput>
<cfoutput>#serializeJSON(record)#</cfoutput>

【问题讨论】:

phihag,正如 John 在下面所说:JSStringFormat 旨在转义数据以包含在 javascript 中,而不是 JSON。 此外,在下一个版本中,Adobe 将使用 OWASP/ESAPI 库,并提供更明确的encodeForJavaScriptencodeForJson 函数。 @JasonDean 对不起,你是对的,那条评论放错了地方,而且是拖钓。删了。 @phihag 你们太棒了。我的也删了。谢谢 我假设您的其他问题与您在此处的更新基本相同(尽管显然您已经在此处更新了一些代码)。您可能想从这里删除它,因为这确实是一个不同的问题。 【参考方案1】:

JSStringFormat 设计用于转义数据以包含在 JavaScript 中,而不是 JSON。在 JavaScript 中,单引号是需要转义的字符。

另一方面,SerializeJSON 实际上是为了输出 JSON,并且符合 JSON 规范。

【讨论】:

谢谢约翰。使用 SerializeJSON,我是否仍然可以输入数据表的特殊前缀和变量"sEcho": 2, "iTotalRecords": 659, "iTotalDisplayRecords": 201, "aaData": 你可以为你想要的输出创建一个结构,然后把它扔到SerializeJSON,它会为你处理转换它和其中包含的所有值。 (在创建结构时使用数组表示法,以确保 CF 不会将您的键名转换为大写)。 再次感谢约翰。我将深入研究文档。任何代码示例也会有所帮助。 真的没什么 - 这是一个例子:&lt;cfset Data = Struct() /&gt; &lt;cfset Data['MixedCaseName'] = "value" /&gt; ... &lt;cfdump var=#serializeJson(Data)# /&gt; 其实 JSStringFormat() 也是用于对 JSON 数据进行编码。只是不是整个 JSON 对象。如果您需要在单个 JSON 值中转义数据,您将使用 JSONFormat()。例如,mykey: '#JSStringFormat(variabletoBeEncoded)#'【参考方案2】:

我在使用数据表时遇到了同样的问题。我所做的修复它是创建 jsstringformat 字符串,然后对返回的字符串进行替换,以删除所有 \' 实例。

<cfset thisColumnString = jsStringFormat(trim((qFiltered[thisColumn][qFiltered.currentRow])))>
<cfset thisColumnString = replacenocase(thisColumnString,"\'","'","all")>
"#thisColumnString#"

【讨论】:

以上是关于jsStringFormat() 和带有 JSON 的撇号的主要内容,如果未能解决你的问题,请参考以下文章

带有 JSON 正文的 GET 方法和带有 RestTemplate 的承载授权

如何发送带有 URL 参数和 JSON 正文的 POST? [关闭]

发送带有请求和美味派的 json 文件

Pandas Series 写入和读取 json 数据会产生带有 to_json 和 read_json 的 ValueError [重复]

带有命名空间和前缀的 Json 到 XML

带有文件和 JSON 对象的多部分请求