Второе редактирование: Вау, я просто бесполезен сегодня. Мой первый ответ вернул JSONValue, что довольно раздражает, если вы хотите работать с JSO.
Редактировать: Aaand только что заметил ваш комментарий, что вы исправили это ... Тем не менее, использование предоставленных инструментов, как правило, поможет вам не попасть в неприятные ситуации, подобные этой.
Вот еще один инструмент, который вы должны знать, особенно если вы используете JSON, а не только объекты из JS: AutoBeans (http://code.google.com/p/google-web-toolkit/wiki/AutoBean) - с ними вам не нужно выписывать код JSNI, просто определите свойства, которые вы ожидаете получить, и он обработает весь код оболочки.
Первый, в основном бесполезный ответ:
eval
не работает так - он предназначен для запуска JS, а не для превращения JSON в данные, а выражение json (также выражение js) не является допустимым утверждением в Javascript. Добавление «(» и «)» к контенту - вот почему оно вообще работает, но это несколько рискованно - обычно лучше, если это возможно, доверять браузеру, чтобы сделать это правильно:
Используйте JSONParser.parseStrict
(или parseLenient
, если вы ожидаете ошибки синтаксического анализа, но абсолютно уверены, что оттуда не может произойти никаких возможных атак - это в конечном итоге вызовет для вас eval, но таким образом вам не нужно поддерживать его ) вместо этого, чтобы убедиться в безопасности содержимого и правильно проанализировать его для js. Чтобы затем превратить это в JSO, вы вызываете .isObject().getJavaScriptObject()
для результата метода синтаксического анализа, который затем должен быть .cast () с правильным значением.