Несоответствие сериализации Coldfusion JSON - PullRequest
1 голос
/ 29 декабря 2011

Я написал следующий компонент:

<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>

Когда я запускаю это в своей среде разработки, я получаю следующее:

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

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

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

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

Ответы [ 4 ]

1 голос
/ 29 декабря 2011

Похоже, что это ошибка в 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 голосов
/ 18 января 2012

Проверьте это.

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

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

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

Попробуйте десериализовать его.ошибка разбора символа 9: 'D' в {"wtf": 4D}

Umm what ??

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

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

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

0 голосов
/ 29 декабря 2011

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

Несколько вещей для проверки

  1. Есть ли различия в исправлениях или исправлениях для серверов CF?

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

  3. Изменится ли что-нибудь, еслиВы var scope local.str?

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

0 голосов
/ 29 декабря 2011

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

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

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

<cfset str.b = Int(23)>

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


Еще один подход к кастингу. Как насчет попытки:

<cfset str.b = JavaCast("int", 23)>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...