Ruby on rails 停止在Ruby on Rails上的散列中编码的字符串

Ruby on rails 停止在Ruby on Rails上的散列中编码的字符串,ruby-on-rails,json,ruby,ruby-on-rails-6,Ruby On Rails,Json,Ruby,Ruby On Rails 6,我试图不在散列中对字符串进行jsonify。它已经逃脱了 阅读PORO处理此问题的方法是将改写为\u json。因此,我将字符串包装在另一个对象中。但我处理的只是一个字符串,当我返回对象时,它会导致堆栈级别太深。当我返回已经编码的字符串时,它显然会试图转义它activesupport-6.0.3.2/lib/active\u support/json/encoding.rb def jsonify(value) case value when Stri

我试图不在散列中对字符串进行jsonify。它已经逃脱了

阅读PORO处理此问题的方法是将
改写为\u json
。因此,我将字符串包装在另一个对象中。但我处理的只是一个字符串,当我返回对象时,它会导致
堆栈级别太深。当我返回已经编码的字符串时,它显然会试图转义它
activesupport-6.0.3.2/lib/active\u support/json/encoding.rb

      def jsonify(value)
        case value
        when String
          EscapedString.new(value)
        when Numeric, NilClass, TrueClass, FalseClass
          value.as_json
        when Hash
          Hash[value.map { |k, v| [jsonify(k), jsonify(v)] }]
        when Array
          value.map { |v| jsonify(v) }
        else
          jsonify value.as_json
        end
      end
我所能做的是使用上面的方法来接受我包装字符串的类,而不做任何事情

我猜另一种选择是将JSON字符串解析回哈希,并让它按照正常过程进行。但这会对我们的表现造成太大的影响

所以我的问题是,有没有更优雅的方式告诉Rails在遇到指定对象时不要做任何事情,而它试图对其进行JSonification

编辑:

我使用这个已经jsonified的字符串,比如:

{foo: MyStringJsonWrapper.new('{"bar":"foobar"}')}.to_json

我在文件
activesupport-6.0.3.2/lib/active\u support/json/encoding.rb中查找,注意到您可以配置用于执行json编码的类。它当前是该类中包含的
JSONGemEncoder

所以我做了自己的课程:

class MyJSONEncoder < ActiveSupport::JSON::Encoding::JSONGemEncoder
  class AlreadyEscapedString < String
    def to_json(*)
      self
    end
  end

  private

  def jsonify(value)
    if value.is_a?(AlreadyEncodedStringWrapper)
      AlreadyEscapedString.new(value.already_jsonified)
    else
      super
    end
  end
end
AlreadyEscapedString
的额外类用于覆盖
EscapedString
(位于同一编码类中)的行为,但不执行任何操作

那么就设置:

ActiveSupport.json_encoder = MyJSONEncoder
例如:

jsonified_hash = {foobar: "barbaz"}.to_json

already_encoded_string = AlreadyEncodedStringWrapper.new(jsonified_hash)

{foo: already_encoded_string}.to_json
=> "{\"foo\": {\"foobar\": \"barbaz\"}}"

你如何在控制器中调用它?请记住,当您执行
呈现json时:@stuff
将调用
as_json
。您应该将此方法命名为_json
。Hi@leslongtingill我这样称呼它:
{foo:MyStringJsonWrapper.new(“{”bar:“foobar”}”)}。to _json
jsonified_hash = {foobar: "barbaz"}.to_json

already_encoded_string = AlreadyEncodedStringWrapper.new(jsonified_hash)

{foo: already_encoded_string}.to_json
=> "{\"foo\": {\"foobar\": \"barbaz\"}}"