Ruby on rails 如何将此哈希转换为可行的JSON?
IE10以类似于双重转换为JSON的方式返回参数:Ruby on rails 如何将此哈希转换为可行的JSON?,ruby-on-rails,ruby,json,internet-explorer,hash,Ruby On Rails,Ruby,Json,Internet Explorer,Hash,IE10以类似于双重转换为JSON的方式返回参数: => {"{\"statementId\":"=> {"\"b3dsecret9-bsecret741-23secreta806c\""=> {",\"Content-Type\":"=> {"\"application/json\""=> {",\"content\":"=> {"\"{\\\"context\\\":{\\\"registrati
=> {"{\"statementId\":"=>
{"\"b3dsecret9-bsecret741-23secreta806c\""=>
{",\"Content-Type\":"=>
{"\"application/json\""=>
{",\"content\":"=>
{"\"{\\\"context\\\":{\\\"registration\\\":\\\"27\\\",\\\"contextActivities\\\":{\\\"parent\\\":{\\\"id\\\":\\\"6LHIJumrnmV_course_id\\\"},\\\"grouping\\\":{\\\"id\\\":\\\"6LHIJumrnmV_course_id\\\"}}},\\\"actor\\\":213,\\\"verb\\\":\\\"attempted\\\",\\\"object\\\":{\\\"id\\\":\\\"6LHIJumrnmV_course_id\\\",\\\"definition\\\":{\\\"name\\\":{\\\"und\\\":\\\"\\\"},\\\"type\\\":\\\"Course\\\",\\\"description\\\":{\\\"und\\\":\\\"\\\"}}}}\""=>
{",\"registration\":"=>
{"\"27\""=>
{",\"AWSAccessKeyId\":"=>
{"\"secretIAIVsecretPHsecretQ\""=>
{",\"Signature\":"=>
{"\"PJ /OW K5secretasyXsecret5A"=>
"\"],\"Expires\":[\"1396873090\"],\"Authorization\":[\"\"]}"}}}}}}}}}}},
"method"=>"PUT",
"controller"=>"quizzes",
"action"=>"statements"}
IE Edge、Safari、Chrome和Firefox返回我的参数如下:
=> {"registration"=>["27"],
"Content-Type"=>["application/json"],
"Signature"=>["secretkqPJGPEsecret01ksecret"],
"AWSAccessKeyId"=>["Asecret6secretPHsecretQ"],
"statementId"=>["5919c4f4-b71c-40dd-81dc-ab63cfc824bd"],
"Expires"=>["1396873699"],
"Authorization"=>[""],
"content"=>
["{\"object\":{\"definition\":{\"type\":\"Course\",\"name\":{\"und\":\"\"},\"description\":{\"und\":\"\"}},\"id\":\"6LHIJumrnmV_course_id\"},\"verb\":\"attempted\",\"context\":{\"registration\":\"27\",\"contextActivities\":{\"parent\":{\"id\":\"6LHIJumrnmV_course_id\"},\"grouping\":{\"id\":\"6LHIJumrnmV_course_id\"}}},\"actor\":213}"],
"method"=>"PUT",
"controller"=>"quizzes",
"action"=>"statements",
"quiz"=>{}
因此,我的代码通过以下方式方便地解析:
content = params[:content] || params['content']
response = JSON.parse(content.first)
还有普雷斯托!我有一个可行的内容。但是对于前面提到的第一个散列,我不知道如何转换它。我是否应该考虑使用match/gsub技术来删除所有这些邪恶的前斜杠?有没有办法把它破译成类似于我的后一个散列的东西?这给了我一个答案。。这不是最好的。这绝对是一次黑客攻击。但我觉得这是我唯一得到的东西
def nested_hash_value(obj,key)
# nested_hash_value(params, ",\"content\":")
if obj.respond_to?(:key?) && obj.key?(key)
obj[key]
elsif obj.respond_to?(:each)
r = nil
obj.find{ |*a| r=nested_hash_value(a.last,key) }
r
end
end
extract = nested_hash_value(params, ",\"content\":")
key = extract.keys.first
decoded_hash = key.to_s.gsub(/\\/,'').gsub(/\"/,"'").gsub(/'$|^'/,'').gsub(':','=>')
response = eval decoded_hash
如果我在两个输出之间进行比较,它们将返回true
然后我就把它都扔到营救区
begin
content = params[:content] || params['content']
response = JSON.parse(content.first)
rescue
perform_fd_up_IE_fixer # :)
end
从您的答案开始,我将使用以下命令解析
键
:
这避免了使用邪恶的eval
东西
更一般地说,我认为您应该以以下方式构建您的处理:
def smell_of_ie_weirdness?
# Detects whether the request seems like the one sent by IE 10,
# something like params keys formatting checking etc.
end
def extracted_response
if smell_of_ie_weirdness?
# Do weird stuff
extract_response_for_weird_ie
else
# Be clean and polite
extract_response
end
end
我认为您应该避免在服务器端修复错误,而应该在客户端修复它,因为错误是客户端产生的。我不确定我是否理解你的建议。在任何情况下,因为我使用的是blackbox API(这意味着我不能触摸它产生的内容)。。我只需要处理它给我带来的任何垃圾。为了帮助我,我们需要知道是什么导致IE如此行事。请描述触发该响应的情况并显示代码。是Javascript吗?我不确定有没有办法找到答案。我有一个blackbox API(Flash),我在iFrame中加载它。加载应用程序后,它会向我的服务器发送请求。如果我使用IE10或更少,那么它返回的参数与我提到的示例相同。我不可能调整或查看API的代码本身。如果
params
是{statementId\:“=>{b3dsecret9-bsecret741-23secreta806c\”=>{,\“Content Type\”:“=>{code>application/json\”=>{,\“Content\:”=>{{{{code\\\\\\\\\\'恶意命令\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\secretaivsecretphsecretq \“=>{”,“签名\”:“=>{”PJ/OW K5secretasyXsecret5A”=>“\”],“过期\\”:[\“1396873090\”],“授权\[\”:[\“\”]}},“方法”=>“放置”,“控制器”=>“测验”,“动作”=>“语句”}
(请注意恶意命令
部分)我的想法正是如此。。我正在从我正在处理的地方后退,处理原始请求。我意识到这些请求不一致地改变了形状,只是没有加起来。非常有创意的回应。谢谢
def smell_of_ie_weirdness?
# Detects whether the request seems like the one sent by IE 10,
# something like params keys formatting checking etc.
end
def extracted_response
if smell_of_ie_weirdness?
# Do weird stuff
extract_response_for_weird_ie
else
# Be clean and polite
extract_response
end
end