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


#1 楼

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


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

评论


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

– kapso
2010年7月6日在16:49

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

– kapso
2010年7月6日在16:56

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

–MladenJablanović
2010年7月6日在17:05

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

– kapso
2010年7月12日在5:25

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

–道格拉斯·艾伦(Douglas G. Allen)
13年7月16日19:00



#2 楼

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

puts {hash: 123}.to_json


#3 楼

您还可以使用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

–bkunzi01
20年7月13日在20:22

#4 楼

在文件顶部添加以下行

require 'json'


然后您可以使用:

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


,您可以使用:

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


#5 楼

您应该在文件中包含json

例如,

require 'json'

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


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