gpt4 book ai didi

ruby - 何时在 Ruby 的 JSON 库中使用转储与生成与 to_json 以及加载与解析?

转载 作者:数据小太阳 更新时间:2023-10-29 06:49:40 24 4
gpt4 key购买 nike

david4dev 对 this question 的回答声称存在三种使用 json 库将对象转换为 JSON 字符串的等效方法:

JSON.dump(object)
JSON.generate(object)
object.to_json

以及将 JSON 字符串转换为对象的两种等效方法:

JSON.load(string)
JSON.parse(string)

但是查看源代码,它们每个似乎都非常不同,并且它们之间存在一些差异(例如,1)。

它们之间有什么区别?什么时候使用哪个?

最佳答案

长话短说:

一般来说:

  • 使用to_json (或等效的 JSON::generate )。
  • 使用JSON::parse .

对于某些特殊用例,您可能需要 dumpload , 但使用 load 是不安全的不是您自己创建的数据。


扩展说明:

JSON::dump 对比 JSON::generate

作为其参数签名的一部分,JSON::generate允许您设置缩进级别和空白细节等选项。 JSON::dump ,另一方面,调用::generate本身具有特定的预设选项,因此您无法自行设置这些选项。

根据文档,JSON::dump应该是 Marshal::dump 的一部分实现方案。您想要明确使用 ::dump 的主要原因自 ::dump 起,您自己将要流式传输您的 JSON 数据(例如通过套接字)。允许你传递一个类似 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,它将在从数据解析的每个 Ruby 对象上调用;它还带有一个警告 ::load只应与受信任的数据一起使用。 ::parse没有这样的限制,因此 JSON::parse是解析不受信任的数据源(例如用户输入和文件或内容未知的流)的正确选择。

关于ruby - 何时在 Ruby 的 JSON 库中使用转储与生成与 to_json 以及加载与解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com