2012-05-21 2 views
1

Я пытаюсь использовать SerializeJSON(), чтобы превратить экземпляр CFC в строку, которую я могу хранить в базе данных, а затем снова вытащить ее обратно.ColdFusion SerializeJSON создает пустые значения

Проблема у меня используется следующий код:

<cfdump var="#THIS#"> 

    <!--- Convert CFC to JSON ---> 
    <cfset thisJSON = SerializeJSON(THIS)> 

    <cfdump var="#DeserializeJSON(thisJSON)#"> 

дает мне следующее:

CFDump of THIS and after Serialize/DeSerialize process

Красный дамп показывает CFC, с массивом называется controls с В нем 7 элементов, каждый из которых является еще одним простым CFC. Когда я запускаю serializeJSON, а затем выгружаю результат этого, после передачи его обратно через deserializeJSON, пункты 3-7 превратились в пустые строки.

Вот JSON:

{ 
    "MESSAGE":"", 
    "CONTROLS":    
    [ 
     { 
      "INDEX":"1.0", 
      "NAME":"maxP11D", 
      "SELWHERE":"", 
      "DEF":"7940.0", 
      "MMD":true, 
      "ORDER":"7", 
      "APP":"", 
      "PRE":"", 
      "MAXCAP":"35946.0", 
      "FORMAT":"pound", 
      "VALUE":"", 
      "DESC":"List price exc FRF & VED", 
      "MINCAP":"7939.0", 
      "MINVAL":"7939.0", 
      "MAXVAL":"35946.0", 
      "TYPE":"range", 
      "TITLE":"P11D" 
     },    
     { 
      "INDEX":"2.0", 
      "NAME":"Y13Taxat22", 
      "SELWHERE":"", 
      "DEF":"0.0", 
      "MMD":true, 
      "ORDER":"6", 
      "APP":" pa", 
      "PRE":"Tax at 20%", 
      "MAXCAP":"1904.1099853515625", 
      "FORMAT":"pound", 
      "DESC":"Personal tax rate", 
      "VALUE":"", 
      "MINVAL":"0", 
      "MINCAP":"0.0", 
      "MAXVAL":"1904.1099853515625", 
      "TYPE":"range", 
      "TITLE":"Company car tax" 
     }, 
     "", 
     "", 
     "", 
     "", 
     "" 
    ], 
    "SELECTRESTRICT":" 
     (taxtype<6)AND ([email protected]@)\r\nAND t.model NOT LIKE @%407%@\r\nAND 
     t.model NOT LIKE @% [email protected]\r\nAND t.model != @107 3 [email protected]\r\nAND 
     t.model != @107 5 [email protected]\r\nORDER BY \r\nt.model = @%iOn%@ 
     DESC,\r\nt.model = @107 3 door [email protected] DESC,\r\nt.model = @107 5 door [email protected] 
     DESC,\r\nt.model LIKE @%207%@ DESC,\r\nt.model LIKE @%RCZ%@ 
     DESC,\r\nt.model LIKE @%308%@ DESC,\r\nt.model LIKE @%3008%@ 
     DESC,\r\nt.model LIKE @%4007%@ DESC,\r\nt.model = @508 [email protected] 
     DESC,\r\nt.model = @508 [email protected] DESC,\r\nt.model = @508 [email protected] 
     DESC,\r\nt.model LIKE @%5008%@ DESC,\r\nt.model LIKE @%807%@ 
     DESC,\r\nt.model LIKE @%Bipper%@ DESC,\r\nt.model LIKE @%Partner%@ 
     DESC,\r\nt.model ASC 
    ",  
    "SHOWNOTES":true, 
    "MYSQL": {   
     "WHERE":"", 
     "COLS":" 
      t.maxP11D, t.Y13Taxat22, t.Y13Taxat40, t.CO2gpkm, 
      t.fuelConsumptionDf, t.bodyStyle, t.fuelType, 
     ", 
     "EXCLUDE":"" 
    } 
} 

Почему бы первые 2 пунктов преобразования успешно, но оставшиеся 5 изменений в строки?

Я уверен, что этот код использовался для работы, я недавно обновился до CF 9.0.1, у кого-то еще была проблема с JSON в 9.0.1?

+0

Думаю, нам нужно будет увидеть размытую часть компонентов. Я также думаю, что возможно # thisJSON # может дать вам дополнительные подсказки. –

+0

Размытая часть - это просто путь к компоненту, например «path.to.component», как в 'var t = new path.to.component()'. И я сделал дамп '# thisJSON #', и массив элементов управления выглядит примерно так: '' CONTROLS ": [{...}, {...}," "," "," "," " , ""] ', поэтому вы можете видеть, что 5 элементов в конце строки json - это просто пустые строки –

+0

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

ответ

2

есть некоторые основные проблемы с serializeJSON в ACF 9. Убедитесь, что у вас есть cumlative исправление 2 установлено:

http://helpx.adobe.com/coldfusion/kb/cumulative-hot-fix-2-coldfusion-1.html

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

http://www.epiphantastic.com/cfjson/

+0

Хм, кстати, это то, что я уверен, что он работал, когда он был CF9, после перехода на CF9.0.1 он прекратил работать. Я полагаю, что поддерживает ваш аргумент для Hot Fix. Я попробую это –

+0

Я считаю, что это ошибка CF9. У меня была такая же проблема после установки HF2.Придется удалить CF9, переустановить CF9, обновить до CF901 и применить HF1 для исправления. Кажется, что HF1 - единственная версия, которая действительно работает. – Abram

+0

Исправление 2 исправить это! Я применил исправление 2, но я не очистил кеш браузера, поэтому файлы cookie, которые у меня были до исправления с неполным JSON, все еще болтались. Потребовалось некоторое время, чтобы очистить мой кеш, но потом стало очевидно, что Coldfusion Hotfix 2 исправил эту проблему! Все как раз к выпуску Coldfusion 10. Ну ладно, спасибо за вашу помощь всем! –

1

Вы женаты с помощью serializeJson(), или - если все вы после serialising объект - будет objectSave() быть лучшим вариантом ?

+0

Он собирается в базу данных, поэтому с помощью serializeJSON для создания строки делаются вещи приятными и легкими в сочетании с deserializeJSON. Идентификатор сохраненного сериализованного объекта удерживается в сеансе, я полагаю, я мог бы просто сохранить имя файла, в который был сохранен объект, хотя я бы хотел удалить файлы, когда они больше не нужны, что похоже на это будет труднее сделать, чем подход БД –

+0

Зачем вам сохранять объект в файл, если вы не хотите, чтобы он был файлом? Просто сохраните его в двоичном объекте, преобразуйте его в базу 64, сохраните его как строку. Когда вы хотите вернуть его обратно, прочитайте его из базы данных и преобразуйте обратно в двоичный код с помощью toBinary() и к объекту с objectLoad(). Это больше шагов, чем использование JSON, но он имеет преимущество в использовании подходящего инструмента для предполагаемой работы. Плюс это * работает * ... если вы сериализуете затем десериализуете объект с помощью serializeJson(), вы не получаете объект, вы получаете конструкцию. Не то же самое. –

+0

Я дал эту попытку, но она усекается в базе данных MySQL, а затем я получаю java.io.EOFException, используя objectLoad. Я думаю, мне может потребоваться переосмыслить, как этот CFC построен –

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