我在看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
。#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
的更多信息,请访问下面的链接。杰森学习
评论
我只能说是哇:)也非常感谢!所以基本上我能够动态扩展json类?
– kapso
2010年7月6日在16:49
我用Ruby对象尝试了同样的事情,它不起作用? >> require'json'=> true >>类Person >> attr_accessor:fname,:lname >> end => nil >> p = Person.new =>#
– 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