我需要将哈希对象转储到JSON,我想知道这三个中的哪一个to_json
,JSON.generate
或JSON.dump
是首选方法。
我已经测试了这些方法的结果,它们是相同的:
> {a: 1, b: 2}.to_json
=> "{\"a\":1,\"b\":2}"
> JSON.generate({a: 1, b: 2})
=> "{\"a\":1,\"b\":2}"
> JSON.dump({a: 1, b: 2})
=> "{\"a\":1,\"b\":2}"
答案 0 :(得分:7)
来自docs:
JSON.generate
仅允许将对象或数组转换为JSON语法。但是,to_json
接受许多Ruby类,即使它只作为序列化的方法
和
[
JSON.dumps
]是Marshal和YAML的加载/转储接口实现的一部分。如果给出
anIO
(类似IO
的对象或响应write方法的对象),则会将生成的JSON写入其中。
答案 1 :(得分:4)
JSON.generate
仅允许将对象或数组转换为JSON语法。
to_json
接受许多Ruby类,即使它只作为序列化的方法
JSON.generate(1)
JSON::GeneratorError: only generation of JSON objects or arrays allowed
1.to_json
=> "1"
JSON.dump
:将obj转储为JSON字符串,在对象上调用generate并返回结果。
您可以从here
获取更多信息答案 2 :(得分:2)
对于转储数组,散列和对象(由to_hash
转换),这3种方法是等效的。
但是JSON.generate
或JSON.dump
只允许数组,哈希和对象。
to_json
接受许多Ruby类,即使它只作为序列化的方法,如整数:
JSON.generate 1 # would be allowed
1.to_json # => "1"
JSON.generate
为输出样式(如空格,缩进)提供了更多选项
并且JSON.dump
输出默认样式,但是将类似IO的对象作为第二个参数写入,第三个参数作为嵌套数组或对象的限制数。
答案 3 :(得分:0)
$file_path = '/route/to/path/file.xlsx';
if (file_exists($file_path)) {
return Yii::$app->response->sendFile($file_path);
}else{
return 'file not found';
}
使用巨大的哈希值(300MB),无法生成json字符串,因此崩溃了。
但是to_json
确实有效,JSON.generate
也有效。