将 Ruby 字符串编码为 JSON 字符串
json
gem 不允许直接将字符串编码为其 JSON 表示形式。我暂时将这个 PHP 代码: 移植
$text = json_encode($string);
到这个 Ruby:
text = string.inspect
它似乎完成了这项工作,但由于某种原因,如果 string
本身包含带有换行符的文字字符串(它实际上是 JS 代码),这些换行符 \n
将保持原样 \n
,而不是编码为 \\n
。我可以理解这是否是 #inspect
的正确行为,但是...
如何将字符串值编码为其在 Ruby 中的 JSON 表示形式?
The json
gem does not allow for directly encoding strings to their JSON representation. I tentatively ported this PHP code:
$text = json_encode($string);
to this Ruby:
text = string.inspect
and it seemed to do the job but for some reason if the string
itself contains a literal string (it's actually JS code) with newlines, these newlines \n
will stay as-is \n
, not be encoded to \\n
. I can understand if this is the correct behaviour of #inspect
, but...
How does one encode a string value to its JSON representation in Ruby?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
这适用于库存 1.9.3+ 标准库 JSON:
如果没有
quirks_mode: true
,您会得到可笑的“JSON::GeneratorError:仅允许生成 JSON 对象或数组”。This works with the stock 1.9.3+ standard library JSON:
Without
quirks_mode: true
, you get the ridiculous "JSON::GeneratorError: only generation of JSON objects or arrays allowed".从 Ruby 2.1 开始,您可以
As of Ruby 2.1, you can
Ruby 有无数的 JSON gem,有些是纯 Ruby,有些是基于 C 的以获得更好的性能。
下面是一个同时提供纯 Ruby 和 C 语言的版本:
http://flori.github.com/json/
然后它的本质是:
一个流行的 JSON 编码器/具有本机 C 绑定以提高性能的解码器是 Yajl: https://github.com/brianmario/yajl-ruby< /a>
来自@Stewart的UPD:
JSON.encode
由 Rails 提供,object.to_json
也是如此。对于 Rails 之外的使用,请使用 ruby 1.9.3 std-lib 中的 JSON.generate。 ——斯图尔特There are a myriad of JSON gems for Ruby, some pure Ruby some C-based for better performance.
Here is one that offers both pure-Ruby and C:
http://flori.github.com/json/
And then its essentially:
A popular JSON encoder/decoder with native C-bindings for performance is Yajl: https://github.com/brianmario/yajl-ruby
UPD from @Stewart:
JSON.encode
is provided by rails as isobject.to_json
. For uses outside of rails useJSON.generate
which is in ruby 1.9.3 std-lib. – Stewart