如何在 Ruby 中创建 JSON 对象

Posted

技术标签:

【中文标题】如何在 Ruby 中创建 JSON 对象【英文标题】:How to create a JSON object in Ruby 【发布时间】:2017-02-25 14:44:53 【问题描述】:

我正在使用 Ruby 创建一个 JSON 文件。 我需要在 JSON 文件中创建对象“公司”。

预期结果:

"companies":[
    \"label\":\"Wayfair \",\"values\":[54],
    \"label\":\"Move24 \",\"values\":[29],
    \"label\":\"Auto1 \",\"values\":[23],
...
]

我得到了什么:

[  
   "\"label\":\"Wayfair \",\"values\":[54,54]",
   "\"label\":\"Move24 \",\"values\":[29,29]",
   "\"label\":\"GetYourGuide \",\"values\":[28,28]",
   "\"label\":\"Auto1.com \",\"values\":[20,20]", ...
]

我的代码:

data_hash = data_hash.map |k,v| label: k, values: v

companies_json = []

data_hash.each do |hash|
  companies_json << hash.to_json
end

File.open('companies.json', 'w') do |f|
  f << companies_json
end

【问题讨论】:

请阅读“minimal reproducible example”。 companies.json 包含什么?您是否已将代码减少到可以证明问题的最低限度?通常,该任务会揭示问题。 【参考方案1】:

@Phrogz 有正确答案。这是为了对正在发生的事情提供更多解释:

require 'json'

foo = 'a' => 1
foo.to_json # => "\"a\":1"

这就是 JSON 序列化哈希的样子。它是一个包含转义引号的字符串,包裹着键,: 分隔键和值对。 JSON 始终是一个数组 "[...]" 或一个哈希 "...",在任何一种情况下它都是一个字符串。这就是序列化的作用以及 JSON 的工作原理。

[foo.to_json] # => ["\"a\":1"]
[foo.to_json].class # => Array

这是一个包含 JSON 序列化哈希的数组,这就是您正在做的事情。你可以看出它没有被正确序列化,因为它是一个数组,而不是一个字符串。周围的[...] 在引号,而在JSON 中它们在引号内:

[].to_json # => "[]"
.to_json # => ""

继续……

[foo].to_json # => "[\"a\":1]"
[foo].to_json.class # => String

这是一个序列化的哈希数组。在这种情况下,它是一个单一的哈希,但对于这个例子来说已经足够了。序列化后是一个String,可以看出是因为数组[...]inside周围的引号内。


如果您真的想了解这些内容,我强烈建议您阅读 JSON home page,以及 Ruby 的 JSON、YAML 和 Psych 文档。 JSON is nearly a subset of YAML,因此了解 YAML 以及 Psych 如何实现它对于您开始使用 JSON、YAML 和互联网时真的很有帮助。

“Fer 实例”:

json_hash = '"a":1'
yaml_hash = "---\na: 1"

require 'yaml'
YAML.load(json_hash) # => "a"=>1
YAML.load(yaml_hash) # => "a"=>1

Psych.load(json_hash) # => "a"=>1
Psych.load(yaml_hash) # => "a"=>1

require 'json'
JSON[json_hash] # => "a"=>1
JSON[yaml_hash] # => JSON::ParserError: 743: unexpected token at '---\na: 1'

有点让你大吃一惊,不是吗?

【讨论】:

【参考方案2】:

您的问题的核心是您正在创建一个 JSON 字符串数组,而不是一个数组,然后创建该 JSON。而不是:

companies_json = []

data_hash.each do |hash|
  companies_json << hash.to_json
end

做:

companies = []

data_hash.each do |hash|
  companies << hash
end

companies_json = companies.to_json

【讨论】:

嗨@Phrogz,谢谢你,但你的sn-p得到了同样的结果。没有公司对象,数组是 Ruby 而不是 json。 你不能得到同样的结果; @Phrogz 的做法是将散列数组序列化为 JSON。您的方式是创建一个 JSON 序列化哈希数组。有很大的不同。

以上是关于如何在 Ruby 中创建 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ActiveRecords 中创建对 Ruby 中对象的引用?

如何在 Ruby 中创建一个新的 Date 实例

如何使用 Javascript 在 JSON 中创建多个对象? [复制]

如何像在 Prime 类中一样在 Ruby 中创建默认实例?

如何在类别中创建 UITableViewCell 明智地排列 JSON 对象

如何在反应钩子中创建一个新的 JSON 对象?