Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.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转换为多维数组_Ruby_Json - Fatal编程技术网

在Ruby中将JSON转换为多维数组

在Ruby中将JSON转换为多维数组,ruby,json,Ruby,Json,如何将JSON数据字符串转换为多维数组 # Begin with JSON json_data = "[ {"id":1,"name":"Don"}, {"id":2,"name":"Bob"}, ... ]" # do something here to convert the JSON data to array of arrays. # End with multidimensional arrays array_data = [ ["id", "name"],

如何将JSON数据字符串转换为多维数组

# Begin with JSON
json_data = "[
  {"id":1,"name":"Don"},
  {"id":2,"name":"Bob"}, 
  ...
]"

# do something here to convert the JSON data to array of arrays.

# End with multidimensional arrays
array_data = [
  ["id", "name"],
  [1,"Don"],
  [2,"Bob"],
  ...
]

这应该可以做到:

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.parse
将JSON读入一个数组。对于JSON中的每个元素,我们使用
inject
收集所有键和值,这将产生以下数组:

[
  ["id", "name"],
  [1, "Don"],
  ["id", "name"],
  [2, "Bob"]
]
为了消除重复的键数组,我们调用
uniq
,并完成

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

这应该可以做到:

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.parse
将JSON读入一个数组。对于JSON中的每个元素,我们使用
inject
收集所有键和值,这将产生以下数组:

[
  ["id", "name"],
  [1, "Don"],
  ["id", "name"],
  [2, "Bob"]
]
为了消除重复的键数组,我们调用
uniq
,并完成

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

除了@tessi的答案之外,如果我们将“with_index”和“inject”结合起来,就可以避免使用“uniq”

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"]]

除了@tessi的答案之外,如果我们将“with_index”和“inject”结合起来,就可以避免使用“uniq”

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"]]

为了可读性和效率,我会这样做:

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"]] 

为了可读性和效率,我会这样做:

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"]]