Ruby on rails 停止在Ruby on Rails上的散列中编码的字符串
我试图不在散列中对字符串进行jsonify。它已经逃脱了 阅读PORO处理此问题的方法是将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
改写为\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\"}}"