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


339

如何将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

Answers:


562

Ruby的众多优点之一就是可以用自己的方法扩展现有的类。这称为“类重新开放”或“猴子修补”(尽管后者的含义可能有所不同)。

因此,在这里看看:

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"}"

如您所见,jsonrequire神奇地to_json为我们带来了方法Hash


2
我只能说是哇:)也非常感谢!所以基本上我能够动态扩展json类?
kapso

1
我用Ruby对象尝试了同样的事情,它不起作用?>> require'json'=> true >>类Person >> attr_accessor:fname,:lname >> end => nil >> p = Person.new =>#<Person:0x101155f70> >> p.fname =“ Bill “ =>”比尔“ >> p.lname =”发光“ =>”发光“ >> p.to_json =>” \“#<人:0x101155f70> \”“
kapso

10
不,不,必须有人编码如何将任意类的对象序列化为JSON。他们这样做是为了Hash和gem Arrayjson,但是您的课程Person只是一个普通的类Object。但是您可以继承Hash。如果您不进行管理,则可以打开一个新问题。
MladenJablanović10年

谢谢。这是新问题,我们将不胜感激。谢谢。 stackoverflow.com/questions/3226054/...
kapso

您正在显示看起来是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}“,因此您可能会看到它正在键符号作为字符串,当然数据是不变的。再次感谢。对不起,我来晚了。
道格拉斯·艾伦

19
require 'json/ext' # to use the C based extension instead of json/pure

puts {hash: 123}.to_json

6

您也可以使用JSON.generate

require 'json'

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

或其别名JSON.unparse

require 'json'

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

3

在文件顶部添加以下行

require 'json'

然后,您可以使用:

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

或者,您可以使用:

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

-1

您应该json在文件中包含

例如,

require 'json'

your_hash = {one: "1", two: "2"}
your_hash.to_json

有关json您的更多信息,请访问下面的链接。 杰森学习

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.