如何在Ruby中创建JSON对象
我正在用Ruby创建一个JSON文件。 我需要在JSON文件中创建对象“companys” 预期结果:如何在Ruby中创建JSON对象,json,ruby,parsing,Json,Ruby,Parsing,我正在用Ruby创建一个JSON文件。 我需要在JSON文件中创建对象“companys” 预期结果: {"companies":[ {\"label\":\"Wayfair \",\"values\":[54]}, {\"label\":\"Move24 \",\"values\":[29]}, {\"label\":\"Auto1 \",\"values\":[23]}, ... ]} 我得到的是: [ "{\"label\":\"Wayfair \",\
{"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
data_hash=data_hash.map{k,v{label:k,values:v}
公司_json=[]
数据散列。每个都做散列|
问题的核心是创建一个json字符串数组,而不是数组,然后生成json。而不是:
companies_json = []
data_hash.each do |hash|
companies_json << hash.to_json
end
companys\u json=[]
数据散列。每个都做散列|
公司_json@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
这是一个序列化的哈希数组。在本例中,它是一个散列,但对于本例来说已经足够了。它是序列化后的一个字符串,因为数组[…]
在周围的引号中,所以可以看出这一点
如果你真的想理解这些东西,我强烈建议你阅读Ruby和文档,因此,了解YAML以及Psych是如何实现它的,在您开始使用JSON、YAML和internet时,这将非常有帮助
“Fer实例”:
有点让你心烦意乱,不是吗?请读“”。companys.json
包含什么?您是否已将代码缩减到演示问题的最低限度?通常,这个任务会揭示问题。嗨@Phrogz,谢谢你,但是我从你的代码片段中得到了同样的结果。没有company对象,数组是Ruby而不是json;@Phrogz的做法是将哈希数组序列化为JSON。您的方法是创建一个JSON序列化哈希数组。这有很大的区别。
[foo].to_json # => "[{\"a\":1}]"
[foo].to_json.class # => String
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'