铁轨上的红宝石 - 名字中的转义'@'



我使用Rails 4.2.0和ActiveResource来实现服务器API的web客户端。我遇到的问题是服务器资源在属性名中包含"@"one_answers"@@"。因此,在创建ARes对象时,ActiveResource不能正确处理这些属性。示例:服务器返回JSON数据:

{"@@artist"=>
  {"@id"=>"some_text_id",
   "@name"=>"Carman",
   "@publisher"=>"Carmen radio",
   "@category"=>"Music",
   "@automaticallyGenerated"=>true,
   "@@options"=>{"@public"=>true, "@enabled"=>false},
   "_extended"=>{"@container"=>"Music box", "region"=>"Europe"}}}

在创建ARes对象之前重命名属性的变体:(从name中删除'@'或将其替换为另一个符号)。在这种情况下,我需要在发送POST, PUT请求(例如调用resource.save)之前做回重命名属性,例如在名称的开头添加'@'或'@@'。

你能建议更灵活和漂亮的变体吗?

我真的不知道你的输出是什么,但是你可以使用这样的东西。

input = {
  "@@artist"=>
  {"@id"=>"some_text_id",
  "@name"=>"Carman",
  "@publisher"=>"Carmen radio",
  "@category"=>"Music",
  "@automaticallyGenerated"=>true,
  "@@options"=>{"@public"=>true, "@enabled"=>false},
  "_extended"=>{"@container"=>"Music box", "region"=>"Europe"}
  }
}
def transcode(hash)
  result = {}
  hash.each do |k, v|
    result[k.gsub(/@*/, "")] = ( Hash === v ? transcode(v) : v )
  end
  result
end
output = transcode(input)
#{
#  "artist" => {
#  "id" => "some_text_id",
#  "name" => "Carman",
#  "publisher" => "Carmen radio",
#  "category" => "Music",
#  "automaticallyGenerated" => true,
#  "options" => {
#  "public" => true,
#  "enabled" => false
#  },
#  "_extended" => {
#  "container" => "Music box",
#  "region" => "Europe"
#  }
#  }
#}

input = {
  "@@artist"=>
  {"@id"=>"some_text_id",
  "@name"=>"Carman",
  "@publisher"=>"Carmen radio",
  "@category"=>"Music",
  "@automaticallyGenerated"=>true,
  "@@options"=>{"@public"=>true, "@enabled"=>false},
  "_extended"=>{"@container"=>"Music box", "region"=>"Europe"}
  }
}
def transcode(hash)
  result = {}
  hash.each do |k, v|
    result[k.gsub(/@*/, "")] = ( Hash === v ? transcode(v) : v )
  end
  result
end
def transcode_back(hash, output)
  result = {}
  hash.each do |k, v|
    value = output[k.gsub(/@*/, "")]
    result[k] = ( Hash === value ? transcode_back(v, value) : value )
  end
  result
end
output = transcode(input)
# you can modify values
#output["artist"]["name"] = "CarmanNew"
result = transcode_back(input, output)
output == result # is same ?
# true

最新更新