ChatGPT解决这个技术问题 Extra ChatGPT

如何将 ruby 哈希对象转换为 JSON?

如何将 ruby 哈希对象转换为 JSON?所以我在下面尝试这个例子,它不起作用?

我正在查看 RubyDoc,显然 Hash 对象没有 to_json 方法。但我正在阅读 Rails 支持 active_record.to_json 并且还支持 hash#to_json 的博客。我可以理解 ActiveRecord 是一个 Rails 对象,但 Hash 不是 Rails 原生的,它是一个纯 Ruby 对象。所以在 Rails 中你可以做 hash.to_json,但不能在纯 Ruby 中?

car = {:make => "bmw", :year => "2003"}
car.to_json

C
Community

Ruby 的众多优点之一是可以使用您自己的方法扩展现有类。这称为“类重新打开”或猴子修补(尽管是后者 can vary 的含义)。

所以,看看这里:

car = {:make => "bmw", :year => "2003"}
# => {:make=>"bmw", :year=>"2003"}
car.to_json
# NoMethodError: undefined method `to_json' for {:make=>"bmw", :year=>"2003"}:Hash
#   from (irb):11
#   from /usr/bin/irb:12:in `<main>'
require 'json'
# => true
car.to_json
# => "{"make":"bmw","year":"2003"}"

如您所见,要求 json 神奇地将方法 to_json 引入了我们的 Hash


我只能说哇 :) 也非常感谢!!所以基本上我能够动态扩展 json 类?
我用 Ruby 对象尝试了同样的事情,但它不起作用? >> 要求 'json' => true >> class Person >> attr_accessor :fname, :lname >> end => nil >> p = Person.new => # >> p.fname = "Bill " => "Bill" >> p.lname = "Shine" => "Shine" >> p.to_json => "\"#\""
不,不,必须有人编写如何将任意类的对象序列化为 JSON 的代码。他们为 json gem 中的 HashArray 类做到了,但您的类 Person 只是一个普通的 Object。但您可以改为继承 Hash。如果您不管理,您可以打开一个新问题。
谢谢。这是新问题,任何帮助将不胜感激。谢谢。 stackoverflow.com/questions/3226054/…
您正在显示看起来是 IRB 类型的输出。我试图让 hash#to_json 为 DateTime 对象工作。感谢这篇文章,我明白了。但我确实用 p date_json 检查了这是我得到的真正字符串 "{\"year\":2013,\"mon\":7,\"mday\":16,\"hour\":13, \"min\":54,\"sec\":32,\"zone\":\"-05:00\",\"offset\":-18000}" 所以你可能会看到它正在键符号作为字符串,当然数据是不变的。再次感谢。对不起,我来晚了。
n
nurettin
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json

V
Vinicius Brasil

您还可以使用 JSON.generate

require 'json'

JSON.generate({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

或其别名 JSON.unparse

require 'json'

JSON.unparse({ foo: "bar" })
=> "{\"foo\":\"bar\"}"

JSON.generate 只允许将对象或数组转换为 JSON 语法。然而,to_json 接受许多 Ruby 类,即使它仅用作序列化方法: 1.to_json # => “1”。此处的文档:ruby-doc.org/stdlib-2.6.3/libdoc/json/rdoc/JSON.html
A
Apurv Pandey

在文件顶部添加以下行

require 'json'

然后你可以使用:

car = {:make => "bmw", :year => "2003"}
car.to_json

或者,您可以使用:

JSON.generate({:make => "bmw", :year => "2003"})