发布于 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
复制相似问题