为什么to_json返回的String不等于相同的json String

时间:2017-09-18 01:22:43

标签: ruby-on-rails json ruby

在Rails控制台中

> h_json = {key: "value"}.to_json;
#=> "{\"key\":\"value\"}"
> s_json = %Q|{"key": "value"}|
#=> "{\"key\": \"value\"}"
> s_json.class
#=> String
> h_json.class
#=> String

我们可以看到h_jsons_json具有相同的String类,看起来相同,但是

#=> "{\"key\": \"value\"}"
> s_json == h_json
#=> false

他们并不相等,我不明白为什么。

1 个答案:

答案 0 :(得分:2)

如果您检查了to_json函数的源代码,s_json中有一个空格

# File activesupport/lib/active_support/json/encoders/hash.rb, line 33
def to_json(options = nil) #:nodoc:
  hash = as_json(options)

  result = '{'
  result << hash.map do |key, value|
    "#{ActiveSupport::JSON.encode(key.to_s)}:#{ActiveSupport::JSON.encode(value, options)}"
  end * ','
  result << '}'
end

此函数不会在冒号:和值之间添加空格。

实际上, h_json = "{\"key\":\"value\"}"

s_json = "{\"key\": \"value\"}"

如果设置s_json = "{\"key\":\"value\"}",则必须相等。