ColdFusion 10 serializeJSON превращает да/нет строки в логические значения - как остановить его?

У меня есть хранимая процедура, MS SQL Server, один из возвращаемых столбцов - строка, "да" или "нет". Все идет нормально. Я создаю строку JSON в ColdFusion 10 и в конце концов буду пинать это в jQuery/Bootstrap, чтобы положить в таблицу. Если я вызываю writeOutput("SP suitable text: " & spResults.rg_suitable_text[i]); на выходе SP, (и это вычисленное значение, а не фактический столбец с фактическим типом данных в TSQL), он пишет, что он должен делать, то есть да или нет. Однако при построении массива, который будет сериализован как JSON, rg_suitable_text=spResults.rg_suitable_text[i] и т.д., Если я использую клиент REST для Google или Firefox и просматриваю только исходный вывод JSON из ColdFusion, он показывает true/false. Я даже попытался создать новую переменную и жесткое кодирование:

var solicit="No";
if(spResults.rg_suitable_text[i] EQ true OR trim(spResults.rg_suitable_text[i]) EQ "true")
{
    solicit="Yes";
}

и пометки на мой массив, но то же самое происходит. Похоже, ColdFusion 11 поддерживает способ обойти это, но это рабочий проект, так что это не вариант. Есть ли редактирование, которое я могу сделать для вышеупомянутого блока, который скажет: "ColdFusion 10, мне все равно, что вы хотите, это строка и рассматривайте ее как взорванную строку dangit!"

Ответ 1

Чтобы ответить на ваш нижний вопрос (последнее предложение вашего сообщения), ответ: no.

Вы можете испортить данные, чтобы обмануть ColdFusion, считая, что строка не логическая, но это не очень хороший подход.

Вам нужно использовать что-то другое, кроме ColdFusion, для создания строк JSON. ColdFusion изобилует ошибками JSON, в значительной степени спрашивая, что его предложение JSON не подходит для цели. Я думаю, что большинство найденных ошибок были исправлены в CF11, хотя, как вы заметили.

Я не использовал его в prod., но у меня было достаточное количество доказательств успеха, используя Google GSON API для построение JSON из данных CFML.

Ответ 2

JsonSerializer.cfc в github может обрабатывать ваш "это строка и рассматривать ее как взорванную строку, dangit!" запрос.

http://www.bennadel.com/blog/2505-jsonserializer-cfc-a-data-serialization-utility-for-coldfusion.htm

Пример кода:

serializer = new lib.JsonSerializer()
    .asInteger( "age" )
    .asAny( "createdAt" )
    .asDate( "dateOfBirth" )
    .asString( "favoriteColor" )
    .asInteger( "favoriteNumbers" )
    .asString( "firstName" )
    .asString( "lastName" )
    .asString( "nickName" )
    .exclude( "password" );

tricia = {
    FIRSTNAME = "Tricia",
    LASTNAME = "Smith",
    DATEOFBIRTH = dateConvert( "local2utc", "1975/01/01" ),
    NICKNAME = "Trish",
    FAVORITECOLOR = "333333",
    FAVORITENUMBERS = [ true, 4.0, 137, false ],
    AGE = 38,
    CREATEDAT = now(),
    PASSWORD = "I<3ColdFusion&Cookies"
};

writeDump(serializer.serialize( tricia ));

Ответ 3

Я столкнулся с той же проблемой и решил изменить инструкцию SQL, которая вытягивала строковые значения "Нет". Что-то вроде этого:

SELECT CASE WHEN <colname> = 'NO' THEN 'NON' ELSE <colname> AS <colname>, <colname2>, etc...

Затем я обрабатываю строковое значение "NON" из JSON, поскольку я буду обрабатывать случай "НЕТ".

Не самое элегантное решение, но, похоже, оно работает в моем приложении.