Ответ 1
Добавление дополнительного пространства в строку, чтобы предотвратить его преобразование в boolean, а затем обрезать на более поздней стадии.
У меня есть структура данных, хранящаяся в формате JSON, преобразованная с помощью функции serializeJSON. Проблема, с которой я сталкиваюсь, состоит в том, что строки, которые могут быть логическими в CF, такие как Yes, No, True и False, преобразуются в JSON в виде логических значений. Ниже приведен пример кода. Любые идеи о том, как предотвратить это?
код:
<cfset test = {str='Yes'}>
<cfset json = serializeJSON(test)>
<cfset fromJSON = deserializeJSON(json)>
<cfoutput>
#test.str#<br>
#json#<br>
#fromJSON.str#
</cfoutput>
Результат:
Yes
{"STR":true}
YES
Добавление дополнительного пространства в строку, чтобы предотвратить его преобразование в boolean, а затем обрезать на более поздней стадии.
Я считаю, что ваше или любое подобное "принудительное форматирование строки" является единственным возможным способом предотвращения такого поведения в Adobe CF на данный момент.
BTW, Railo работает так, как ожидалось, с вашим примером. Вот результат:
Yes
{"STR":"Yes"}
Yes
Он также работает одинаково для чисел с конечными нулями.
он взломан, но если вы условно выведете yes и no как "_yes_" и "_no_" (используя оператор switch, а затем после сериализации JSON в строку, выполните поиск и замените, он работает.
raw_json=serializeJSON(object);
raw_json=ReplaceNoCase(raw_json,':"_Yes_"',':"Yes"',"ALL");
raw_json=ReplaceNoCase(raw_json,':"_No_"',':"No"',"ALL");
по крайней мере, CF постоянно расстраивает это, истина и ложь преобразуются в да нет, когда вы совершаете обход данных
Используйте JsonSerializer.cfc Бен Надель
Я знаю, что этот ответ не сработал бы, когда вопрос был задан, но поскольку это похоже на то, что люди находят при исследовании этой проблемы, я подумал, что было бы полезно обновить новое исправление.
Для тех, кто на CF2016, Adobe внедрила новую функцию, чтобы помочь устранить эту проблему. Это было бы предпочтительнее, если бы было добавлено пространство перед строками, хотя это все равно нужно было работать для релизов до CF2016, как описано Sergii.
Используйте функцию struct, setMetadata, чтобы указать метаданные.
Метаданные - это структура, где каждый ключ является структурным ключом, а значение каждого ключа указывает информацию о том, как сериализоваться в JSON.
Значение ключа может быть строкой или структурой.
Значение как строка
metadata = {firstname: "string" }};
Значение как struct
metadata = {firstname: {type: "string" }};
Пример:
<cfscript>
example = structnew();
example.firstname = "Yes";
example.lastname = "Man";
// changing the default serialization by specifying the type of "firstname" as string
metadata = {firstname: {type:"string"}};
example.setMetadata(metadata);
writeoutput(SerializeJSON(example));
</cfscript>
Я попробую javacasting: key = javacast("string", "yes")
. Это должно заставить CF распознавать его как строку, а не как логическую.