【问题标题】:How to create a JSON Array from a two-dimensional array in Ruby如何从 Ruby 中的二维数组创建 JSON 数组
【发布时间】:2020-04-17 11:21:31
【问题描述】:

我有一个这样的二维数组:

[
  ["01fe237f804a5eff182dcded115c37d3", 0.0140845], 
  ["026e5f1f7f026bf3c763523206aa44bf", 0.03448275], 
  ["04a1c3c79773bd1ecc0372a991adc815", 0.04617604]
]

我想先创建一个哈希,然后将其转换为 JSON,这样结果如下所示:

[{address: "01fe237f804a5eff182dcded115c37d3", value: 0.0140845},
{address: "026e5f1f7f026bf3c763523206aa44bf", value: 0.03448275},
{address: "04a1c3c79773bd1ecc0372a991adc815", value: 0.04617604}]

【问题讨论】:

  • 1.如果您知道 require ‘json’; arr.to_json 将数组 arr 转换为 JSON 字符串,您应该将问题限制在您不理解的部分:如何将二元素数组的数组转换为具有指定键的哈希数组. 2. 总是简化你的例子。在这里arr = [["01fe", 0.014], ["026e", 0.034], ["04a1", 0.046]] 就足够了。 3. 正如我在 #2 中所做的那样,为示例的每个输入分配一个变量(例如,“arr”),以便读者可以在答案和 cmets 中引用这些变量,而无需定义它们...
  • ...4。始终将示例的期望结果显示为 valid Ruby 对象。您显示的内容似乎是一个字符串,但字符串被双引号或单引号包围。 (如果添加双引号,则需要转义内部双引号。)这似乎是一个狡辩,但有些读者对此很挑剔。 5. 这是一个纯 Ruby 问题,所以你不应该有 Rails 的标签。 6. 你的问题是含蓄的(“我该怎么做?”)。这通常会引起评论,“你的问题是什么?”。最好总是说出你的问题...
  • ...7。标签“array”和“hash”可能是不必要的,因为这些常见的对象不太可能被用作搜索词。
  • 欢迎来到 SO!请参阅“Stack Overflow question checklist”和“How to Ask”。我们希望看到您为解决这个问题所做的努力。你研究过吗?如果是这样,它在哪里以及为什么没有帮助?你写代码了吗?如果是这样,演示您遇到的问题的最少代码是什么,那个问题是什么?否则,您似乎没有尝试并希望我们为您编写偏离主题的代码。

标签: arrays ruby-on-rails json ruby hash


【解决方案1】:

您想要的结果仍然是一个 Ruby 哈希。要对其进行转换,请在数组上调用 map 并为每个条目创建一个哈希:

a = [
  ["01fe237f804a5eff182dcded115c37d3", 0.0140845],
  ["026e5f1f7f026bf3c763523206aa44bf", 0.03448275],
  ["04a1c3c79773bd1ecc0372a991adc815", 0.04617604]
]

a.map{ |e| {address: e[0], value: e[1]} }

这将返回所需的结果。

如果你想创建一个 JSON 字符串,需要 json 并执行以下操作:

require 'json'

a = [
  ["01fe237f804a5eff182dcded115c37d3", 0.0140845],
  ["026e5f1f7f026bf3c763523206aa44bf", 0.03448275],
  ["04a1c3c79773bd1ecc0372a991adc815", 0.04617604]
]

a.map{|e| {address: e[0], value: e[1]} }.to_json

这会将结果编码为以下字符串:

"[{\"address\":\"01fe237f804a5eff182dcded115c37d3\",\"value\":0.0140845},{\"address\":\"026e5f1f7f026bf3c763523206aa44bf\",\"value\":0.03448275},{\"address\":\"04a1c3c79773bd1ecc0372a991adc815\",\"value\":0.04617604}]"

【讨论】:

  • 如果这真的有帮助,我们将不胜感激。 ;)
  • 简单整洁+1,我用不同的方法完成了
  • 有些人可能更喜欢a.map { |v1,v2| { address: v1, value: v2 } }.to_json 以提高可读性。
【解决方案2】:

你可以这样做,

require 'json'
keys = [:address, :value]
arr.map { |values| Hash[keys.zip(values)] }.to_json

【讨论】:

  • 值得注意的是,Hash[keys.zip(values)] 可以替换为 keys.zip(values).to_h,尽管我认为两者都不是首选。您的答案的优势在于,如果嵌入带有参数arrkeys 的方法中,keys 可以是任意大小(而不是仅在有两个键时才有效)。
猜你喜欢
  • 2020-09-07
  • 2016-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多