我在这里有点头疼 - 我对Ruby很新......
我有一个像Savon那样的结构......
{
:item => [{
:key => "result",
:value=> "success"
},
{
:key => "data",
:value=> {
:item => [{ :key => "displayName",
:value => "Matt"
},
{
:key => "messages",
:value => {
:items => [{....}]
}
]
}
}]
}
我需要让它像... ...
{
:result => success
:data => [{
:displayName => "Matt"
},
{
:messages => [{
:messageName => "Test Message"
}]
}]
}
因此,我可以轻松地操纵和导航数据结构 我尝试了一些方法,包括只传递:item ...
的值def convertData(data)
result = {}
if(data!=nil)
data.each do |item|
key = item[:key]
value = item[:value]
if(value.instance_of?(Hash))
result[key] = convertData(value[:item])
else
result[key] = value
end
end
end
return result
end
但这只是给了我一大堆的符号到整数转换的类型错误(我假设这是数组索引播放)。任何帮助非常感谢。
答案 0 :(得分:1)
当试图在Ruby中解决这样的问题时,根据数据上的转换来考虑它是有用的。 Ruby Enumerable库中有很多方法可以帮助你操作像Array和Hash这样的常规数据结构。
这个问题的Ruby解决方案如下:
def desavon(data)
case (data)
when Hash
if (data[:item])
data[:item].collect do |item|
{ item[:key] => desavon(item[:value]) }
end
else
# raise error?
end
else
data
end
end
这里有一些示例输入数据和样本输出:
input = {
item: [
{
key: "result",
value: "success"
},
{
key: "data",
value: {
item: [
{
key: "displayName",
value: "Matt"
},
{
key: "messages",
value: {
item: [
{
key: 'messageName',
value: 'Test Message'
}
]
}
}
]
}
}
]
}
desavon(input)
# => [{"result"=>"success"}, {"data"=>[{"displayName"=>"Matt"}, {"messages"=>[{"messageName"=>"Test Message"}]}]}]
我认为这个版本在输出方面看起来更好,但这是你必须做出的一个电话:
def desavon(data)
case (data)
when Hash
if (data[:item])
Hash[
data[:item].collect do |item|
[ item[:key], desavon(item[:value]) ]
end
]
else
# raise error?
end
else
data
end
end
desavon(input)
# => {"result"=>"success", "data"=>{"displayName"=>"Matt", "messages"=>{"messageName"=>"Test Message"}}}
请注意,此处的case
语句确实是关键,它允许您快速区分您要转换的不同类型的数据,Hash[]
方法将键值对转换为你正在寻找的哈希结构。
这与您的尝试类似,但只是传递它不会按原样识别的内容。
答案 1 :(得分:1)
Savon在结果上提供to_hash
方法。
我通常做的是:
...
response = @client.request :wsdl, :conversion_rate do
soap.body = {
"FromCurrency" => from_curr,
"ToCurrency" => to_curr
}
end
response.to_hash[:conversion_rate_response][:conversion_rate_result];
... 完整脚本https://gist.github.com/sroller/3d04842ab763f52b6623