【问题标题】:How to create a JSON object in Ruby如何在 Ruby 中创建 JSON 对象
【发布时间】: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 包含什么?您是否已将代码减少到可以证明问题的最低限度?通常,该任务会揭示问题。

标签: json ruby parsing


【解决方案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 的 JSONYAMLPsych 文档。 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 序列化哈希数组。有很大的不同。
    猜你喜欢
    • 2023-03-04
    • 2016-01-23
    • 2017-05-23
    • 2011-03-17
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    相关资源
    最近更新 更多