转储JSON对象的首选方法是什么? to_json,JSON.generate还是JSON.dump?

时间:2015-09-24 07:48:20

标签: ruby json

我需要将哈希对象转储到JSON,我想知道这三个中的哪一个to_jsonJSON.generateJSON.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}"

4 个答案:

答案 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.generateJSON.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也有效。