将 Ruby 字符串编码为 JSON 字符串。

25

json gem无法直接将字符串编码为其JSON表示形式。我试图移植了这段PHP代码:

$text = json_encode($string);

转换成这个 Ruby 代码:

text = string.inspect

我试着这样做,似乎可以完成任务,但出现一个问题:如果string本身包含一个字面字符串(实际上是JS代码)并且其中有换行符,这些换行符\n将保持原样而不会编码为\\n。我能理解如果这是#inspect的正确行为,但是...

如何在Ruby中将字符串值编码为其JSON表示形式?

3个回答

24

这适用于原生的 1.9.3+ 标准库 JSON:

require 'json'
JSON.generate('foo', quirks_mode: true) # => "\"foo\""

如果没有设置quirks_mode: true,你将得到荒谬的错误信息 "JSON::GeneratorError: only generation of JSON objects or arrays allowed"。


20

自 Ruby 2.1 起,您可以

require 'json'

'hello'.to_json

3

有许多用于Ruby的JSON宝石,有些是纯Ruby,有些则基于C以提高性能。

这里有一个同时提供纯Ruby和C的宝石: http://flori.github.com/json/

然后本质上就是:

require 'json'
JSON.encode(something)

一个性能优异的带有本地C绑定的流行JSON编码器/解码器是Yajl:https://github.com/brianmario/yajl-ruby @Stewart的更新: JSON.encode由Rails提供,object.to_json也是如此。对于在Rails之外使用,请使用Ruby 1.9.3 std-lib中的JSON.generate。- Stewart

1
如上所述,json gem 不允许直接编码字符串。我将看一下 Yajl。 - Félix Saparelli
为了在yajl中兼容JSON gem,您可以执行require 'yajl/json_gem' - mikeycgto
11
值得注意的是,本回答假定问题发布者正在使用rails(然而这并没有在问题中规定)。JSON.encodeobject.to_json由rails提供。如果用于rails之外的用途,请使用ruby 1.9.3标准库中的JSON.generate - Stewart
@Stewart 的评论应该被加入到那个答案中,我个人认为。 - Hezad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接