发布于 2014-02-17 08:47:00
TL;DR:
一般而言:
to_json
(或等效的JSON::generate
)。JSON::parse
。对于一些特殊的用例,您可能需要dump
或load
,但是在您自己创建的数据上使用load
是不安全的。
扩展解释:
JSON::dump
诉 JSON::generate
作为参数签名的一部分,JSON::generate
允许您设置缩进级别和空格细节等选项。另一方面,JSON::dump
使用特定的预置选项调用内部的::generate
,因此您失去了自己设置这些选项的能力。
根据文档,JSON::dump
是Marshal::dump
实现方案的一部分。您希望自己显式使用::dump
的主要原因是,您将要流您的JSON数据(例如,通过套接字),因为::dump
允许您传递一个类似IO的对象作为第二个参数。不幸的是,正在生成的JSON数据在生成时并不是真正的流;它是集体创建的,只有在完全创建JSON之后才发送。这使得IO参数只在琐碎的情况下有用。
两者之间的最后一个区别是,::dump
也可以采用一个limit
参数,当超过某个嵌套深度时,它会引发ArgumentError。
与 #to_json
的比较
#to_json
接受选项作为参数,因此除了内部实现外,JSON::generate(foo, opts)
和foo.to_json(opts)
也是等价的。
JSON::load
诉 JSON::parse
类似于::dump
在内部调用::generate
,::load
在内部调用::parse
。::load
和::dump
一样,也可以使用IO对象,但同样地,源是一次性读取的,因此流仅限于琐碎的情况。但是,与::dump
/::generate
二元性不同的是,::load
和::parse
都接受选项作为参数签名的一部分。
::load
还可以传递一个proc,它将对从数据中解析的每个::load
对象进行调用;它还附带了一个警告,即::load
只能用于受信任的数据。::parse
没有这样的限制,因此JSON::parse
是解析不受信任数据源(如用户输入和文件或内容未知的流)的正确选择。
https://stackoverflow.com/questions/21823995
复制相似问题