我正在使用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),以便可以使用保存的响应运行更新版本的构建/解析。
答案 0 :(得分:3)
您希望将Hash序列化为文件,然后再将其反序列化。
您可以使用YAML或JSON以及通过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中加载。
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
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