5

我正在处理一些作为 Ruby 哈希字符串返回的命令输出。(来自称为 mcollective 的东西)。

这是我收到的示例字符串:

{:changes=>{"total"=>0},     :events=>{"failure"=>0, "success"=>0, "total"=>0},     :version=>      {"puppet"=>"2.7.21 (Puppet Enterprise 2.8.1)", "config"=>1381497648},     :time=>      {"filebucket"=>0.000287,       "cron"=>0.00212,       "package"=>0.398982,       "exec"=>0.001314,       "config_retrieval"=>5.60761618614197,       "anchor"=>0.001157,       "service"=>0.774906,       "total"=>9.85111718614197,       "host"=>0.002662,       "user"=>0.063606,       "file"=>2.998467,       "last_run"=>1381497660},     :resources=>      {"skipped"=>6,       "failed_to_restart"=>0,       "out_of_sync"=>0,       "failed"=>0,       "total"=>112,       "restarted"=>0,       "scheduled"=>0,       "changed"=>0}}

我有能力为此编写一个迷你解析器,但这将是一项繁琐的任务。有谁知道可以为我将其转换为 Python 字典的库或代码片段?

如果您认为我应该解析它,欢迎提供任何提示。

4

3 回答 3

6

您可以使用以下命令轻松将其转换为 JSON:

ruby -e 'require "json"; puts JSON.generate({:ruby_hash => "whatever etc..."})'

然后使用 Python 的 JSON 库来解析它。

于 2013-10-11T13:36:05.857 回答
5

实际上,写一些足够好的东西来满足我的需求并不算太糟糕。不是最漂亮的东西,但它会为我做。

# Sometimes MCO gives us a ruby hash as a string, We can coerce this into json then into dictionary
def convert_hash_to_dict(self,ruby_hash):
    dict_str = ruby_hash.replace(":",'"')    # Remove the ruby object key prefix
    dict_str = dict_str.replace("=>",'" : ') # swap the k => v notation, and close any unshut quotes 
    dict_str = dict_str.replace('""','"')    # strip back any double quotes we created to sinlges
    return json.loads(dict_str) 
于 2013-10-11T16:18:55.610 回答
3

您是否考虑过使用 Ruby 将其序列化为 JSON?这样您就可以使用 Python 的 JSON 库对其进行反序列化。

如果这不是一个选项,您可以使用此库相对轻松地定义自定义结构化语言解析器:https ://pypi.python.org/pypi/Parsley

于 2013-10-11T13:35:33.877 回答