【问题标题】:Find content inside JSON object in Ruby在 Ruby 中查找 JSON 对象内的内容
【发布时间】:2016-04-04 17:56:58
【问题描述】:

我有一个这样的 JSON 对象:

[{
  "content.app" => {
    "type" => "content", "depends_on" => [],
    "primary" => {
      "id" => 1,
      "attributes" => {
        "data" => "my data"
      },
      "meta" => { "schema_version" => "1" }
    }
  }
 }, {
  "content.mongodb" => {
    "type" => "content", "depends_on" => [],
    "primary" => {
      "id" => 2,
      "attributes" => {
        "data" => "my data from app"
      }, "meta" => { "schema_version" => "1" }
    }
  }
 }, {
  "stuff.other" => {
    "type" => "content", "depends_on" => [],
    "primary" => {
      "id" => 2, "attributes" => {
        "data" => "my data from mongodb"
      }, "meta" => { "schema_version" => "1" }
    }
  }
}]

我正在寻找类似的结果:

"content.app" => "my data from app",
"content.mongodb" => "my data from mongodb"

如何从content.* 等所有键中获取attributes

【问题讨论】:

  • 第一步是使用map将此结构转换为更接近您所寻找的结构。
  • 欢迎来到 Stack Overflow。当询问时,我们希望看到您的努力的一个例子。你在哪里搜索的?为什么没有帮助?你写了什么代码来解决这个问题?请阅读“How to Ask”和codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question。 SO 不是“为我编写代码”网站,而是“帮助我修复我编写的代码”网站,因此展示您所做的工作很重要。

标签: ruby json hash filter


【解决方案1】:

简单的方法是使用inject 和Ruby 2.3 的Hash#dig 遍历数据:

data = ... # that array of hashes
data.inject({}){|h,v|
  v.inject(h){|h,(k,v)| h[k] = v.dig("primary", "attributes", "data"); h }
h}
# => {"content.app"=>"my data", "content.mongodb"=>"my data from app", "stuff.other"=>"my data from mongodb"}

【讨论】:

  • 有时each_with_object({ }) 更清晰,您不必记住将哈希链接起来。很高兴看到 Hash#dig 被使用!
【解决方案2】:

一个简单的实现是将每个散列传递给一个负责提取它们的类。比如:

class AttributesExtractor
  def initialize(hash)
    @hash = hash
    @primary_key = hash.keys.first.to_s
  end

  def extract
    return unless primary_key_pattern?

    attr_data = hash[primary_key].dig('primary', 'attributes', 'data')

    if attr_data
      {hash.keys.first => attr_data}
    end
  end

  private

  attr_reader :hash, :primary_key

  def primary_key_pattern?
    primary_key.split('.').first.to_s == 'content'
  end
end

the_array_of_hash.map { |hash| AttributesExtractor.new(hash).extract }.compact
=> [{"content.app"=>"my data"}, {"content.mongodb"=>"my data from app"}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    相关资源
    最近更新 更多