jsStringFormat() и апостроф с помощью JSON

#javascript #json #coldfusion #datatables

#javascript #json #coldfusion #таблицы данных

Вопрос:

Итак, у меня возникла интересная проблема jsStringFormat() при попытке экранировать специальные символы для JSON. Я использую плагин jQuery datatables и выполняю AJAX-вызов Coldfusion.

Похоже, что происходит то, что 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. Прямо сейчас я не получаю ничего, кроме запятых, поэтому я знаю, что он правильно зацикливается, но не заполняет данные в нужных местах.

Все это основано на коде источника данных datatables 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>
  

Комментарии:

1. пхихаг, как говорит Джон ниже: JSStringFormat предназначен для экранирования данных для включения в JavaScript, а не JSON. Кроме того, в следующем выпуске Adobe использует библиотеку OWASP / ESAPI и предоставляет более четкие encodeForJavaScript и encodeForJson функциональные возможности.

2. @JasonDean Извините, вы правы, этот комментарий был неуместным и троллинговым. Удалил его.

3. @phihag Очень большой с твоей стороны. Я также удалил свой. Спасибо

4. Я предполагаю, что ваш другой вопрос в основном совпадает с вашим обновлением здесь (хотя, очевидно, вы немного обновили свой код). Возможно, вы захотите удалить его отсюда, поскольку это действительно другой вопрос.

Ответ №1:

JSStringFormat предназначен для экранирования данных для включения в JavaScript, а не JSON. В JavaScript одинарная кавычка — это символ, который необходимо экранировать.

С другой стороны, SerializeJSON на самом деле предназначен для вывода JSON и соответствует спецификации JSON.

Комментарии:

1. Спасибо, Джон. Смогу ли я по-прежнему вводить специальные префиксы и переменные для таблиц данных с помощью serializeJSON "sEcho": 2, "iTotalRecords": 659, "iTotalDisplayRecords": 201, "aaData":

2. Вы можете создать структуру для желаемого результата и просто использовать ее, SerializeJSON и она обработает его преобразование и все значения, содержащиеся внутри, для вас. (Используйте обозначение массива при создании структуры, чтобы убедиться, что CF не преобразует ваши имена ключей в верхний регистр).

3. Еще раз спасибо, Джон. Я углублюсь в документацию. Любые примеры кода также были бы полезны.

4. На самом деле в этом нет ничего особенного — вот пример: <cfset Data = Struct() /> <cfset Data['MixedCaseName'] = "value" /> ... <cfdump var=#serializeJson(Data)# />

5. На самом деле, JSStringFormat() также предназначен для кодирования данных в JSON. Просто НЕ весь объект JSON. Если вам нужно экранировать данные в одном значении JSON, вы должны использовать JsonFormat() . Например, {mykey: ‘#JSStringFormat(переменная предварительно закодирована)#’}

Ответ №2:

я столкнулся с той же проблемой с таблицами данных. чтобы это исправить, я создал строку jsstringformat, а затем выполнил замену возвращаемой строки, чтобы удалить все экземпляры ‘ with ‘ .

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