首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么时候在Ruby的JSON中使用转储、生成和to_json,加载和解析?

什么时候在Ruby的JSON中使用转储、生成和to_json,加载和解析?
EN

Stack Overflow用户
提问于 2014-02-17 08:23:24
回答 1查看 5.4K关注 0票数 16

David4dev对这个问题的回答声称,使用json库将对象转换为JSON字符串有三种等效的方法:

代码语言:javascript
运行
复制
JSON.dump(object)
JSON.generate(object)
object.to_json

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

代码语言:javascript
运行
复制
JSON.load(string)
JSON.parse(string)

但是从源代码来看,它们似乎各不相同,而且它们之间也有一些差异(例如,1)。

他们之间有什么不同?什么时候用哪种?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-17 08:47:00

TL;DR:

一般而言:

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

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

扩展解释:

JSON::dump JSON::generate

作为参数签名的一部分,JSON::generate允许您设置缩进级别和空格细节等选项。另一方面,JSON::dump使用特定的预置选项调用内部的::generate,因此您失去了自己设置这些选项的能力。

根据文档,JSON::dumpMarshal::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是解析不受信任数据源(如用户输入和文件或内容未知的流)的正确选择。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21823995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档