Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中创建JSON对象_Json_Ruby_Parsing - Fatal编程技术网

如何在Ruby中创建JSON对象

如何在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 \",\

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

预期结果:

{"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'