2011-12-28 4 views
1

Я написал следующий компонент:Coldfusion JSON сериализации несогласованность

<cfcomponent> 

<cffunction name="test" returntype="struct" access="remote" returnformat="json"> 
    <cfset local.str = structNew()> 

    <cfset str.a = "hello"> 
    <cfset str.b = 23> 

    <cfreturn local.str> 
</cffunction> 

</cfcomponent> 

Когда я запускаю это в моем Dev среде я получаю следующее:

{"A":"hello","B":"23"} 

В производстве, я получаю это:

{"A":"hello","B":23} 

Тот же код, тот же вариант CF, тот же JVM, разные результаты. Кто-нибудь знает, почему?

+3

же версии CF, но они применяются одни и те же исправления? – Henry

+0

re комментарий Генри: Какую версию CF вы используете? 7, 8 или 9? Недавно было исправлено исправление для CF 8 и 9, в котором была сделана корректировка того, как был выпущен JSON. (Не уверен, что он был сделан для CF7.) –

+0

Это версия CF 9,0,1,274733. Я рассмотрю исправления ... – KingErroneous

ответ

0

Если вы установили элементы Struct, используя cfscript вместо cfset у вас есть другой результат? например .:

<cfscript> 
str.a = "hello"; 
str.b = 23; 
</script> 

Вы также можете попробовать ваш cfset как:

<cfset str.b = Int(23)> 

Я не видел поведение, описанное, возможно, один из этих подходов поможет.


Еще один подход к литью. Как насчет попыток:

<cfset str.b = JavaCast("int", 23)> 
+0

К сожалению, ни одна из этих проблем не устраняет проблему. –

0

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

Несколько вещей, чтобы проверить

  1. Любые различия в пластыря или исправления для серверов CF?

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

  3. Что-то изменится, если вы var scope local.str?

Другой вариант рассмотреть использует CFJSON, который я считаю, гораздо более последовательным, сериализации, то вывести строку. Мы используем это наше основное приложение (нынешний сопровождающий фактически был консультантом, который сделал для нас определенную работу).

1

Похоже, что это ошибка в CF9. Не знаете, как вы получаете разные результаты от вашей локальной/производственной версии. Смотрите этот блог для детального обсуждения:

http://coldfusion.tcs.de/adobe-please-fix-coldfusion-serializejson/

Похоже, у вас есть четыре варианта.

  1. Изменить код ожидать строки вместо номер
  2. откатить CF сервер до 9.0
  3. Используйте Railo вместо Adobe CF
  4. Переключитесь на другой сериализатор JSON. Видимо есть два имени CFJSON: http://cfjson.riaforge.org/ и Дэн Робертс предложение http://www.epiphantastic.com/cfjson/
+0

Я также предлагаю вилку для JSONUtil, мои личные предпочтения: http://jsonutil.riaforge.org/ –

0

Проверить это один из.

Любая цельная цифровая строка с конечным D или F, за которой следует пробел.

<cfscript> 
struct = { "wtf" = "4D " }; 
string = serializeJSON(struct); 

string == {"wtf":4D } 
</cfscript> 

Попробуйте десериализовать его.

<cfscript> 
struct = deserializeJSON('{"wtf":4D }'); 
</cfscript> 

JSON синтаксического анализа на провал символа 9: 'D' в { "WTF": 4D}

Умм что ??

Парсер обрезает и проверяет, имеет ли последний символ D или F (двойной или поплавок) и полоски его. Если остальные символы являются числовыми, кавычки не добавляются.

Если у вас нет конечных пробелов, он отлично работает. Конкретная комбинация числа, D | F и пробелов расправляется.

(я представил его Adobe cfbugs)

Смежные вопросы