2010-06-27 3 views
3

Я использую sun.misc.BASE64Encoder для кодирования зашифрованного значения, которое затем добавляется в поле JSON и затем отправляется клиенту. Я использую функцию eval() Javascript на клиенте для создания объекта из кода JSON. При выполнении Eval(), он выдает ошибку:javascript eval json с base64 закодированным полем

unterminated string literal

Есть другие поля в коде JSON, но я сузил ошибку специально для base64 кодированного поля. Вот виновная линия яваскрипта кода:

var result = eval('(' + xhr.responseText + ')'); 

Вот объект JSON из Servlet:

{ 
    'resource':'resource?Signature=j79r/2Hly+HqhS/6fdd+prfsR+kUNijUvDN0QJ14ZR43gzYScOMDypt/crks/CEphTUXVptJvSol 
1ZOOvScCUhNOCb7dZk/3MKnI5tOewSACXK32/OJNd8hYpZtSTn+WhA6+f9BUIUZWA83U8Cud/Tb8V 
R1yQWbDGG/mM/NiUSiY=', 

'url':'http://somesite.com/pr' 
} 

Я не уверен, почему Eval умирает, но, кажется, значение «ресурс» Поле JSON содержит что-то, на что он не заботится.

Заранее спасибо. Tim

+1

Возможно, это \ n, которые убивают eval() ...? – Tim

+1

Кстати, вы на самом деле используете недействительный JSON. JSON использует двойные кавычки вокруг имен свойств и строковых значений, а не одинарных кавычек. Очевидно, это работает, если вы просто «eval», но строгий парсер JSON потерпит неудачу. –

ответ

1

Я думаю, это может быть потому, что ваш JSON, похоже, имеет разрывы строк. Если вы удалите их, это сработает?

+0

Это похоже на довольно вероятный клей. Некоторые кодировщики Base64 действительно вставляют эти разрывы строк ... но из-за вставки точки с запятой JavaScript литеральные строки внутри строк могут вызывать проблемы. Тим, вы можете проверить не только то, что предложил Алекс здесь, но и посмотреть, есть ли у sun.misc.BASE64Encoder какие-либо опции для управления разрывами строк. –

+0

Просто посмотрел источник sun.misc.Base64Encoder здесь: http://www.source-code.biz/base64coder/java/Base64Coder.java.txt. Если вы используете метод encodeLines, вы можете попробовать просто использовать 'encode'. –

+0

Да, удаление строк строки из закодированной строки предотвращает ошибку. Мне кажется, что достойный кодировщик Base64 не должен выводить '\ n'. – Tim