如何在Ruby中创建JSON对象

cat*_*h22 11 ruby parsing json

我正在用Ruby创建一个JSON文件.我需要在JSON文件中创建对象"companies".

预期结果:

{"companies":[
    {\"label\":\"Wayfair \",\"values\":[54]},
    {\"label\":\"Move24 \",\"values\":[29]},
    {\"label\":\"Auto1 \",\"values\":[23]},
...
]}
Run Code Online (Sandbox Code Playgroud)

我得到了什么:

[  
   "{\"label\":\"Wayfair \",\"values\":[54,54]}",
   "{\"label\":\"Move24 \",\"values\":[29,29]}",
   "{\"label\":\"GetYourGuide \",\"values\":[28,28]}",
   "{\"label\":\"Auto1.com \",\"values\":[20,20]}", ...
]
Run Code Online (Sandbox Code Playgroud)

我的代码:

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
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 11

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

companies_json = []

data_hash.each do |hash|
  companies_json << hash.to_json
end
Run Code Online (Sandbox Code Playgroud)

做:

companies = []

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

companies_json = companies.to_json
Run Code Online (Sandbox Code Playgroud)

  • 你不能得到同样的结果;@Phrogz 的做法是将哈希数组序列化为 JSON。您的方法是创建一个 JSON 序列化哈希数组。有很大的不同。 (3认同)

the*_*Man 8

@Phrogz有正确的答案.这是为了解释正在发生的事情:

require 'json'

foo = {'a' => 1}
foo.to_json # => "{\"a\":1}"
Run Code Online (Sandbox Code Playgroud)

这就是JSON序列化哈希的样子.它是一个字符串,包含包装密钥的转义引号,并:分隔键和值对.JSON总是一个数组,"[...]"或者一个哈希,"{...}"在任何一种情况下它都是一个String.这就是序列化的作用以及JSON的工作原理.

[foo.to_json] # => ["{\"a\":1}"]
[foo.to_json].class # => Array
Run Code Online (Sandbox Code Playgroud)

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

[].to_json # => "[]"
{}.to_json # => "{}"
Run Code Online (Sandbox Code Playgroud)

继续...

[foo].to_json # => "[{\"a\":1}]"
[foo].to_json.class # => String
Run Code Online (Sandbox Code Playgroud)

这是一个序列化的哈希数组.在这种情况下,它只是一个哈希,但对于这个例子来说就足够了.这是序列化,你可以告诉,因为数组后的String [...]内部周围引号.


如果您真的想了解这些内容,我强烈建议您阅读JSON主页,以及Ruby的JSON,YAMLPsych文档.JSON几乎是YAML的一个子集,所以当你开始使用JSON,YAML和互联网时,了解YAML以及Psych如何实现它是非常有用的.

"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'
Run Code Online (Sandbox Code Playgroud)

有点打击你的心灵不是吗?