Как я могу запретить SerializeJSON изменять Да/Нет/Истина/Ложные строки для 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

Ответы

Ответ 1

Добавление дополнительного пространства в строку, чтобы предотвратить его преобразование в boolean, а затем обрезать на более поздней стадии.

Ответ 2

Я считаю, что ваше или любое подобное "принудительное форматирование строки" является единственным возможным способом предотвращения такого поведения в Adobe CF на данный момент.

BTW, Railo работает так, как ожидалось, с вашим примером. Вот результат:

Yes
{"STR":"Yes"}
Yes 

Он также работает одинаково для чисел с конечными нулями.

Ответ 3

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

Ответ 5

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

Для тех, кто на CF2016, Adobe внедрила новую функцию, чтобы помочь устранить эту проблему. Это было бы предпочтительнее, если бы было добавлено пространство перед строками, хотя это все равно нужно было работать для релизов до CF2016, как описано Sergii.

Для структур в CF2016:

Используйте функцию 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>

Ответ 6

Я попробую javacasting: key = javacast("string", "yes"). Это должно заставить CF распознавать его как строку, а не как логическую.