Ruby on Rails сериализует и затем десериализует тот же объект в JSON - PullRequest
0 голосов
/ 16 ноября 2010

Я потратил несколько дней на то, чтобы опробовать все библиотеки JSON, включая гем JSON, Yajl-ruby, ActiveSupport :: JSON, и ничто не может сделать эту простую задачу:

user = User.find(1)
json = user.to_json
user2 = json.as_json # OR json.from_json 
                     # OR JSON.parse(json) 
                     # OR Yajl::Parser.parse(json)
                     # OR ActiveSupport::JSON.decode(json)

Когда я пытаюсь использоватьдесериализовав данные JSON для создания нового пользователя, я получаю одну из следующих ошибок:

User.new(Yajl::Parser.parse(json))  
# ActiveRecord::UnknownAttributeError: unknown attribute: json_class

User.new(json.as_json)
# NoMethodError: undefined method `stringify_keys!' for #<String:0xb6de4318>

User.new(JSON.parse(json))
# NoMethodError: undefined method `stringify_keys!' for #<User:0xb6dc7470>

User.new(ActiveSupport::JSON.decode(json))
# NoMethodError: undefined method `stringify_keys!' for #<User:0xb6da3764>

Это очень легко сделать с помощью YAML, используя to_yaml и from_yaml.Почему to_json не может создать вид JSON, который from_json может преобразовать обратно в объект ruby?

Редактировать: я использую Rails 2.3.8, хотя я пробовал 2.3.5 и 3.0.0.Кроме того, я использую плагин json-rpc для создания службы JSON-RPC, хотя та же проблема сохраняется и без плагина.

1 Ответ

4 голосов
/ 16 ноября 2010
json = Episode.first.to_json
dec = ActiveSupport::JSON.decode json
Episode.new dec['episode']

У меня работает в Rails 3.0.1.В ваших примерах вы не извлекали фактические атрибуты dict из оболочки упаковочных файлов после преобразования JSON в RubyВы должны попробовать

User.new(ActiveSupport::JSON.decode(json)['user'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...