如何在 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 中对象的引用?
如何使用 Javascript 在 JSON 中创建多个对象? [复制]
如何像在 Prime 类中一样在 Ruby 中创建默认实例?