【问题标题】:transform JSON to hashmap in Ruby在 Ruby 中将 JSON 转换为 hashmap
【发布时间】:2016-11-23 20:53:34
【问题描述】:

我正在尝试将包含对象和数组的 json 文件转换为 JSON 文件。

下面是 JSON 文件

{
    "localbusiness":{
        "name": "toto",
        "phone": "+11234567890"
    },
    "date":"05/02/2016",
    "time":"5:00pm",    
    "count":"4",
    "userInfo":{
        "name": "John Doe",
        "phone": "+10987654321",
        "email":"john.doe@unknown.com",
        "userId":"user1234333"
    }
}

我的目标是保存这是一个像 MongoId 这样的数据库。我想使用地图来获得类似的东西:

localbusiness_name => "toto",
localbusiness_phone => "+11234567890",
date => "05/02/2016",
...
userInfo_name => "John Doe"
...

我已经尝试过地图,但它没有拆分本地业务或用户信息的数组

def format_entry
  ps = @params.map do | h |
    ps.merge!(h)
    @@logger.info("entry #{h}")
  end
  @@logger.info("formatting the data #{ps}")
  ps
end

我真的不知道如何解析每个条目并重建名称

【问题讨论】:

  • @params 是 JSON 哈希还是 Rails 变量?是否可以显示format_entry的输出?
  • @ElijahSchutz 格式条目不起作用是合并失败。 params 是 JSON 哈希
  • 您是否有 JSON 文件作为文本,并且您想将其转换为嵌套哈希?如果是这样,require 'json'; myhash = JSON.parse(text); 会这样做。
  • 在我看来,@JimStewart,OP 需要的不仅仅是这个。散列也必须“扁平化”。
  • 你说得对,我看错了。

标签: json ruby mongoid


【解决方案1】:

在我看来,您正试图将内部散列“压平”成一个大散列。 Flatten 不正确,因为您想将散列的键添加到子散列的键中。这将需要遍历散列,然后再次遍历每个子散列。此代码示例仅在您有 1 层深度时才有效。如果你有多个层,那么我建议制作两个方法,或者一个递归方法。

@business = { # This is a hash, not a json blob, but you can take json and call JSON.parse(blob) to turn it into a hash.
    "localbusiness":{
        "name": "toto",
        "phone": "+11234567890"
    },
    "date":"05/02/2016",
    "time":"5:00pm",
    "count":"4",
    "userInfo":{
        "name": "John Doe",
        "phone": "+10987654321",
        "email":"john.doe@unknown.com",
        "userId":"user1234333"
    }
}

@squashed_business = Hash.new

@business.each do |k, v|
  if v.is_a? Hash
    v.each do |key, value|
      @squashed_business.merge! (k.to_s + "_" + key.to_s) => value
    end
  else
    @squashed_business.merge! k => v
  end
end

我注意到在枚举散列 @params.each { |h| ... } 时会得到“意外”结果,因为它同时为您提供了键和值。相反,你想像我在上面的代码示例中那样做@params.each { |key, value| ... }

【讨论】:

  • 没有。我的回答不会改善你的。我一看到它就点了它,当我看到你的评论时,我正要删除我的。
  • 谢谢。我们都只是想帮忙!我认为您使用class 对您的回答做了一些很酷/类似的事情?
  • 我发现你的方法更有效、更直接。重要的部分是 OP 有一个解决方案。你指对了。我们随时为您提供帮助。
猜你喜欢
  • 2019-10-24
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 2011-11-27
  • 2014-03-10
相关资源
最近更新 更多