2016-10-16 16 views
7

Tôi đang tạo tệp JSON bằng Ruby. Tôi cần phải tạo đối tượng "công ty" trong tệp JSON.Cách tạo đối tượng JSON trong Ruby

kết quả mong đợi:

{"companies":[ 
    {\"label\":\"Wayfair \",\"values\":[54]}, 
    {\"label\":\"Move24 \",\"values\":[29]}, 
    {\"label\":\"Auto1 \",\"values\":[23]}, 
... 
]} 

Những gì tôi nhận được:

[ 
    "{\"label\":\"Wayfair \",\"values\":[54,54]}", 
    "{\"label\":\"Move24 \",\"values\":[29,29]}", 
    "{\"label\":\"GetYourGuide \",\"values\":[28,28]}", 
    "{\"label\":\"Auto1.com \",\"values\":[20,20]}", ... 
] 

Mã của tôi:

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 
+2

Vui lòng đọc "[mcve]". 'Companies.json' chứa gì? Bạn đã giảm mã của mình xuống mức tối thiểu để chứng minh vấn đề? Thường thì nhiệm vụ đó sẽ tiết lộ vấn đề. –

Trả lời

8

Cốt lõi của vấn đề của bạn là bạn đang tạo ra một loạt các JSON chuỗi, thay vì mảng và sau đó tạo JSON đó. Thay vì:

companies_json = [] 

data_hash.each do |hash| 
    companies_json << hash.to_json 
end 

làm:

companies = [] 

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

companies_json = companies.to_json 
+0

hi @Phrogz, cảm ơn bạn, nhưng tôi nhận được kết quả tương tự với đoạn trích của bạn.Không có đối tượng công ty và mảng là Ruby thay vì json. – catch22

+1

Bạn không thể nhận được kết quả tương tự; Cách @Phrogz hiện nó đang tuần tự hóa mảng băm thành JSON. Cách của bạn là tạo một mảng các băm được tuần tự hóa JSON. Có một sự khác biệt lớn. –

5

@Phrogz có câu trả lời chính xác. Điều này nhằm cung cấp giải thích thêm một chút về những gì đang xảy ra:

require 'json' 

foo = {'a' => 1} 
foo.to_json # => "{\"a\":1}" 

Đó là những gì mà một mã băm được JSON tuần tự trông giống như thế. Đó là một chuỗi có chứa dấu ngoặc kép thoát khỏi gói khóa, với : phân định cặp khóa và giá trị. JSON luôn là mảng, "[...]" hoặc mã băm, "{...}" và trong cả hai trường hợp, đó là một chuỗi. Đó chỉ là việc serializing làm và cách JSON hoạt động.

[foo.to_json] # => ["{\"a\":1}"] 
[foo.to_json].class # => Array 

Đó là mảng chứa mã băm được JSON tuần tự hóa, đó là những gì bạn đang làm. Bạn có thể nói nó không được tuần tự hóa đúng bởi vì nó là một mảng, không phải là một chuỗi. Các [...] xung quanh là ngoài có dấu ngoặc kép trong khi ở JSON họ bên trong dấu ngoặc kép:

[].to_json # => "[]" 
{}.to_json # => "{}" 

Di chuyển trên ...

[foo].to_json # => "[{\"a\":1}]" 
[foo].to_json.class # => String 

Đó là một mảng serialized băm. Trong trường hợp này, nó là một băm duy nhất, nhưng nó đủ cho ví dụ này. Đó là một Chuỗi sau khi tuần tự hóa, mà bạn có thể biết vì mảng [...]bên trong dấu ngoặc kép xung quanh.


Nếu bạn thực sự muốn hiểu công cụ này tôi khuyên bạn nên đọc cả JSON home page, cùng với tài liệu hướng dẫn JSON, YAMLPsych Ruby. JSON is nearly a subset of YAML, do đó, biết YAML và cách thực hiện Tâm lý là thực sự là hữu ích khi bạn chuyển sang làm việc với JSON, YAML và internet.

"Fer dụ":

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' 

Kinda thổi tâm trí của bạn phải không?

Các vấn đề liên quan