2015-03-01 4 views

ответ

2

Для удобства чтения и эффективности, я хотел бы сделать это следующим образом:

require 'json' 

json_data = '[{"id":1,"name":"Don"},{"id":2,"name":"Bob"}]' 

arr = JSON.parse(json_data) 
    #=> "[{\"id\":1,\"name\":\"Don\"},{\"id\":2,\"name\":\"Bob\"}]" 
keys = arr.first.keys 
    #=> ["id", "name"] 
arr.map! { |h| h.values_at(*keys) }.unshift(keys) 
    #=> [["id", "name"], [1, "Don"], [2, "Bob"]] 
2

Это должно сделать трюк:

require 'json' 
json_data = '[{"id":1,"name":"Don"},{"id":2,"name":"Bob"}]' 
JSON.parse(json_data).inject([]) { |result, e| result + [e.keys, e.values] }.uniq 

Во-первых, мы читаем JSON в массив с JSON.parse. Для каждого элемента в формате JSON, мы собираем все ключи и значения с помощью inject, что приводит к следующему массиву:

[ 
    ["id", "name"], 
    [1, "Don"], 
    ["id", "name"], 
    [2, "Bob"] 
] 

Чтобы избавиться от повторяющихся ключевых массивов, мы называем uniq и сделали.

[ 
    ["id", "name"], 
    [1, "Don"], 
    [2, "Bob"] 
] 
0

Добавление ответа @ TESSI, мы можем избежать использования «Uniq», если мы объединим «with_index» и «» инъецировать.

require 'json' 
json_data = '[{"id":1,"name":"Don"},{"id":2,"name":"Bob"}]' 
array_data = JSON.parse(json_data).each.with_index.inject([]) { |result, (e, i)| result + (i == 0 ? [e.keys, e.values] : [e.values]) } 
puts array_data.inspect 

Результат:

[["id", "name"], [1, "Don"], [2, "Bob"]] 
Смежные вопросы