Подтвердить что ты не робот

Декодирование 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

Это новый нормальный?

4b9b3361

Ответ 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