Ruby on rails 删除HttpParty中用于解析的JSONP

Ruby on rails 删除HttpParty中用于解析的JSONP,ruby-on-rails,ruby,Ruby On Rails,Ruby,我使用的是Google的定义URL,它返回一个包含JSONP数据的响应流(见下文) 响应如下所示: a({"query": "epitome", ...}, 200, null) 在解析JSON之前,我必须去掉回调参数;这意味着删除第一个{之前的所有内容以及最后一个}之后的所有内容 我有正则表达式来去除回调参数,但在HttpParty请求中使用它时遇到问题 用于去除填充的正则表达式 ^\w+\(|[^}]+$ 我尝试过使用以下方法,但出现了错误 base_url = "http://www.

我使用的是Google的定义URL,它返回一个包含JSONP数据的响应流(见下文)

响应如下所示:

a({"query": "epitome", ...}, 200, null)
在解析JSON之前,我必须去掉回调参数;这意味着删除第一个
{
之前的所有内容以及最后一个
}
之后的所有内容

我有正则表达式来去除回调参数,但在HttpParty请求中使用它时遇到问题

用于去除填充的正则表达式

^\w+\(|[^}]+$
我尝试过使用以下方法,但出现了错误

base_url = "http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q="
word = "epitome"

request = HTTParty.get("#{base_url}#{word}").gsub(/^\w+\(|[^}]+$/)
HTTParty会自动尝试解析数据,忽略
gsub方法;因此,我不知道如何在HTTParty尝试解析返回的数据之前添加regexp来剥离回调参数


有关此问题的任何提示?

将httparty更新为最新版本,因为此问题已修复。将javascript响应解析为JSON被禁用,这意味着
HTTParty.get
将返回一个字符串,您可以自己进行替换和解析


只有当响应具有正确的内容类型时(您的示例中的Google服务就是这样),它才会起作用。

这真的很容易做到,除了常规Ruby和它附带的and类之外,没有任何东西。考虑这一点:

require 'open-uri'
require 'json'

URL = 'http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=epitome'
jsonp = open(URL).read
此时,
jsonp
包含来自谷歌API的响应。您想要的部分用大括号括起来
{…}

正则表达式是贪婪的,会尽可能地吞噬一切。这通常是一个问题,但在这种情况下是好的。一个简单的
/{.+}/
模式将找到从第一个
{
到最后一个
}
的所有内容,这是JSON负载,此时,您可以解析:

payload = jsonp[/{.+}/]
# => "{\"query\":\"epitome\",\"sourceLanguage\":\"en\",\"targetLanguage\":\"en\",\"primaries\":[{\"type\":\"headword\",\"terms\":[{\"type\":\"text\",\"text\":\"e·pit·o·me\",\"language\":\"en\",\"labels\":[{\"text\":\"Noun\",\"title\":\"Part-of-speech\"}]},{\"type\":\"phonetic\",\"text\":\"/iˈpitəmē/\",\"language\":\"und\"},{\"type\":\"sound\",\"text\":\"http://www.gstatic.com/dictionary/static/sounds/de/0/epitome.mp3\",\"language\":\"und\"}],\"entries\":[{\"type\":\"related\",\"terms\":[{\"type\":\"text\",\"text\":\"epitomes\",\"language\":\"und\",\"labels\":[{\"text\":\"plural\"}]}]},{\"type\":\"meaning\",\"terms\":[{\"type\":\"text\",\"text\":\"A person or thing that is a perfect example of a particular quality or type\",\"language\":\"en\"}],\"entries\":[{\"type\":\"example\",\"terms\":[{\"type\":\"text\",\"text\":\"she looked the \\x3cem\\x3eepitome\\x3c/em\\x3e of elegance and good taste\",\"language\":\"en\"}]}]},{\"type\":\"meaning\",\"terms\":[{\"type\":\"text\",\"text\":\"A summary of a written work; an abstract\",\"language\":\"en\"}]},{\"type\":\"meaning\",\"terms\":[{\"type\":\"text\",\"text\":\"A thing representing something else in miniature\",\"language\":\"en\"}]}]}]}"
分析:

data = JSON.parse(payload)
# => {"query"=>"epitome",
#     "sourceLanguage"=>"en",
#     "targetLanguage"=>"en",
#     "primaries"=>
#      [{"type"=>"headword",
#        "terms"=>
#         [{"type"=>"text",
#           "text"=>"e·pit·o·me",
#           "language"=>"en",
#           "labels"=>[{"text"=>"Noun", "title"=>"Part-of-speech"}]},
#          {"type"=>"phonetic", "text"=>"/iˈpitəmē/", "language"=>"und"},
#          {"type"=>"sound",
#           "text"=>
#            "http://www.gstatic.com/dictionary/static/sounds/de/0/epitome.mp3",
#           "language"=>"und"}],
#        "entries"=>
#         [{"type"=>"related",
#           "terms"=>
#            [{"type"=>"text",
#              "text"=>"epitomes",
#              "language"=>"und",
#              "labels"=>[{"text"=>"plural"}]}]},
#          {"type"=>"meaning",
#           "terms"=>
#            [{"type"=>"text",
#              "text"=>
#               "A person or thing that is a perfect example of a particular quality or type",
#              "language"=>"en"}],
#           "entries"=>
#            [{"type"=>"example",
#              "terms"=>
#               [{"type"=>"text",
#                 "text"=>
#                  "she looked the x3cemx3eepitomex3c/emx3e of elegance and good taste",
#                 "language"=>"en"}]}]},
#          {"type"=>"meaning",
#           "terms"=>
#            [{"type"=>"text",
#              "text"=>"A summary of a written work; an abstract",
#              "language"=>"en"}]},
#          {"type"=>"meaning",
#           "terms"=>
#            [{"type"=>"text",
#              "text"=>"A thing representing something else in miniature",
#              "language"=>"en"}]}]}]}
现在您有了一个很好的ol'Ruby哈希,可以正常访问:

data['query'] # => "epitome"
总结如下:

require 'open-uri'
require 'json'

URL = 'http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=epitome'

data = JSON.parse(open(URL).read[/{.+}/])

data['query'] # => "epitome"
data['primaries'].size # => 1

而且,它还可以处理常规的JSON结果,因此您不必做任何特殊的事情来处理它们。

使用自定义解析器。在本例中,我使用一个子字符串去除填充,但如果您愿意,可以使用正则表达式:

require 'httparty'

class JsonpParser < HTTParty::Parser
  SupportedFormats = {"text/javascript" => :jsonp}

  def jsonp
    JSON.load(body[2..-11], nil)
  end

end

class Dictionary
  include HTTParty

  parser JsonpParser

  def self.define(word)
    get "http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=#{word}"
  end

end

Dictionary.define 'epitome'
需要“httparty”
类JsonpParser:jsonp}
def jsonp
load(body[2..-11],nil)
结束
结束
类词典
包括HTTParty
解析器JsonpParser
定义自我定义(word)
得到“http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=#{word}”
结束
结束
Dictionary.define“缩影”

请不要将链接放在您试图解析的数据上。当这个链接断开时,其他人很难从你的问题中得到任何有用的东西。相反,在您的问题中提供一个JSONP的最小示例。“有关您编写的代码问题的问题必须在问题本身中描述具体问题,并包括复制问题的有效代码。有关指导信息,请参阅。”
require 'httparty'

class JsonpParser < HTTParty::Parser
  SupportedFormats = {"text/javascript" => :jsonp}

  def jsonp
    JSON.load(body[2..-11], nil)
  end

end

class Dictionary
  include HTTParty

  parser JsonpParser

  def self.define(word)
    get "http://www.google.com/dictionary/json?callback=a&sl=en&tl=en&q=#{word}"
  end

end

Dictionary.define 'epitome'