【问题标题】:Converting a json string to hashie mash将 json 字符串转换为 hashie mash
【发布时间】:2016-04-13 08:10:02
【问题描述】:

我有一个 Web 服务,它返回以下格式的 json:

[
    {
        "key": "linux.ubuntu.ip",
        "value": "10.10.10.10"
    },
    {
        "key": "linux.ubuntu.hostname",
        "value": "stageubuntu"
    }
]

我有一个 ruby​​ 代码调用该服务并获取 json。在这段代码的深处,有一个Hashie::Mash类型的变量configure

我想实现这个:

configure.linux.ubuntu.ip = 10.10.10.10 [Hashie::Mash]
configure.linux.ubuntu.hostname = stageubuntu [Hashie::Mash]

谁能告诉我是否有可能实现这一点(w.r.t 到我拥有的 json 输出)?如果是这样,最好的方法是什么?

【问题讨论】:

  • 使用 json 库。
  • @sawa 我确实参考了以下帖子:stackoverflow.com/questions/13897846/…,但是这个例子中提到的 json 结构与我的不同,有什么建议可以做到这一点吗?跨度>
  • Ruby 中的变量没有类型(类)。您可以只分配具有特定类型的对象。
  • 是的,这可以通过一种非常棘手的方式完成,但为什么需要这样做呢? configure['linux.ubuntu.ip'] = '10.10.10.10' 有那么差吗?
  • 如果您知道如何将 json 转换为 Ruby 对象,那么您的问题应该从那里开始,而无需提及 json。无需将问题复杂化。

标签: ruby json


【解决方案1】:

要将 JSON 字符串转换为 Hashie::Mash 对象,您只需执行以下操作:

require 'json'
require 'hashie'

json_str = '{ "foo": "bar" }'
ruby_hash = JSON.parse(json_str)
Hashie::Mash.new(ruby_hash)

对于这个特定问题,虽然并不理想(但我们都有自己独特的用例),但您需要解析为一个数组,然后将“键”提取到某个未知深度的嵌套 Hashie::Mash 对象中。

require 'json'
require 'hashie'

json_str = <<-JSON
  [
    {
      "key": "linux.ubuntu.ip",
      "value": "10.10.10.10"
    },
    {
      "key": "linux.ubuntu.hostname",
      "value": "stageubuntu"
    }
  ]
JSON

parsed_arr = JSON.parse(json_str)
#=> [{"key"=>"linux.ubuntu.ip", "value"=>"10.10.10.10"}, {"key"=>"linux.ubuntu.hostname", "value"=>"stageubuntu"}]

configure = parsed_arr.map do |parsed_hash|
  method_chain = parsed_hash['key'].split('.')
  init_value   = Hashie::Mash.new(method_chain.pop => parsed_hash['value'])

  method_chain.reverse.inject(init_value) do |ret_value, method_name|
    Hashie::Mash.new(method_name => ret_value)
  end
end.inject(:merge) # <-- hashie is allows you to perform a deep merge into a single object here.

# you can now do

configure.linux.ubuntu.ip = 10.10.10.10 [Hashie::Mash]
#=> "10.10.10.10"

configure.linux.ubuntu.hostname
#=> "stageubuntu"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-19
    • 2018-06-28
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多