Ruby on rails 如何将此哈希转换为可行的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

IE10以类似于双重转换为JSON的方式返回参数:

=> {"{\"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