Декодирование JSON в rails простая строка вызывает ошибку
Я пытаюсь округлить кодировку/декодировать простые строки в json, но я получаю сообщение об ошибке.
В рельсах 2.3. w/ruby 1.8.6, он работал.
>> puts ActiveSupport::JSON.decode("abc".to_json)
abc
=> nil
В рельсах 3.1beta1 w/ruby 1.9.2 он вызывает ошибку.
ruby-1.9.2-p180 :001 > puts ActiveSupport::JSON.decode("abc".to_json)
MultiJson::DecodeError: 706: unexpected token at '"abc"'
from /home/stevenh/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/json/common.rb:147:in `parse'
from /home/stevenh/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/json/common.rb:147:in `parse'
from /home/stevenh/.rvm/gems/ruby-1.9.2-p180/gems/multi_json-1.0.1/lib/multi_json/engines/json_gem.rb:13:in `decode'
[...]
Это почти тот же вопрос, который обсуждался в nil.to_json не может быть проанализирован до нуля?
Но ноль также работал в 2.3/1.8.7.
puts ActiveSupport::JSON.decode(nil.to_json)
nil
Это новый нормальный?
Ответы
Ответ 1
Это изменение произошло с помощью переключения из бэкэнда ActiveSupport JSON в MultiJson, который был включен в Rails 3.1.0.rc1. В команда проекта MultiJson, текущее поведение верное и предыдущая реализация была ошибочной из-за RFC4627 спецификации грамматики JSON:
2. JSON Grammar
A JSON text is a sequence of tokens. The set of tokens includes six
structural characters, strings, numbers, and three literal names.
A JSON text is a serialized object or array.
JSON-text = object / array
Поскольку ни "abc"
, ни "/"abc/""
не являются сериализованными объектами или массивами, ошибка при попытке их декодирования является подходящей.
Диаграммы с сайта
Ответ 2
Да, то, что происходит в Rails3, является новым нормальным. Представленные вами изменения кажутся отражением созревающей структуры.
Предполагается, что методы с именем "encode" и "decode" должны быть полностью совместимы с спецификацией JSON и обратными друг другу.
String # to_json, с другой стороны, является методом типа поведения, который работает как удобство для построения более сложных объектов JSON, предположительно используемых внутри (внутри ActiveSupport), когда Array # to_json или Hash # to_json сталкиваются со значением String как один из их составных элементов.
Ответ 3
Если вам нужно восстановить это поведение, следуйте этим шагам, т.е.
# in your Gemfile
gem 'yajl-ruby'
# in your application.rb
require 'yajl/json_gem'
После этих шагов:
Loading development environment (Rails 3.2.8)
[1] pry(main)> puts ActiveSupport::JSON.decode("abc".to_json)
abc
=> nil
[2] pry(main)> puts ActiveSupport::JSON.decode(nil.to_json)
=> nil