来自文件的Ruby Build Hash

时间:2014-07-11 16:54:21

标签: ruby xml webservice-client savon

我正在使用Web服务并使用Savon执行+ -1000(付费)请求并将请求解析为csv文件。 如果解析失败,我会将xml.hash响应保存在文件中。 如何初始化保存到文件的哈希? (或者我应该用XML保存,然后让savon再次将它变成哈希值?

额外信息:

client = Savon.client do
    wsdl "url"
end

response = client.call(:read_request) do 
  message "dat:number" => number 
end

我使用response.hash来构建/解析我的csv数据。例如:

name = response.hash[:description][:name]

如果建筑失败,我正在考虑将response.hash保存到文件中。但问题是我不知道如何重用已保存的响应(XML / Hash),以便可以使用保存的响应运行更新版本的构建/解析。

2 个答案:

答案 0 :(得分:3)

您希望将Hash序列化为文件,然后再将其反序列化。

您可以使用YAMLJSON以及通过Marshal的二进制文本进行操作。

元帅

def serialize_marshal filepath, object
  File.open( filepath, "wb" ) {|f| Marshal.dump object, f }
end

def deserialize_marshal filepath
  File.open( filepath, "rb") {|f| Marshal.load(f)}
end

Marshaled数据具有用它编写的主要和次要版本号,因此如果Marshal数据版本发生更改,则无法保证始终在另一个Ruby中加载。

YAML

require 'yaml'

def serialize_yaml filepath, object
  File.open( filepath, "w" ) {|f| YAML.dump object, f }
end

def deserialize_yaml filepath
  File.open( filepath, "r") {|f| YAML.load(f) }
end

JSON

require 'json'

def serialize_json filepath, object
  File.open( filepath, "w" ) {|f| JSON.dump object, f }
end

def deserialize_json filepath
  File.open( filepath, "r") {|f| JSON.load(f)}
end

有趣的是,YAML很慢,Marshal和JSON很快。

答案 1 :(得分:1)

如果您的代码期望使用/操作如上所示的ruby哈希,那么如果您想保存Savon响应,那么使用json gem并执行以下操作:

require 'json'

File.open("responseX.json","w") do |f| 
  f << response.hash.to_json 
end

然后,如果您需要读取该文件以重新创建响应哈希:

File.open('responseX.json').each do |line|
  reponseHash = JSON.parse(line)
  # do something with responseHash
end