Ruby on rails 如何使用Nokogiri返回JSON对象

Ruby on rails 如何使用Nokogiri返回JSON对象,ruby-on-rails,json,ruby,nokogiri,Ruby On Rails,Json,Ruby,Nokogiri,我需要获取一个JSON对象: curl -X GET "https://graph.facebook.com/v2.6/<USER_ID>?fields=first_name,last_name,profile_pic,locale,timezone,gender&access_token=PAGE_ACCESS_TOKEN" 没有。如何像在终端中使用cURL一样只获取JSON对象?我不知道为什么要使用Nokogiri解析JSON对象。Nokogiri用于解析XML

我需要获取一个JSON对象:

curl -X GET "https://graph.facebook.com/v2.6/<USER_ID>?fields=first_name,last_name,profile_pic,locale,timezone,gender&access_token=PAGE_ACCESS_TOKEN"    

没有。如何像在终端中使用cURL一样只获取JSON对象?

我不知道为什么要使用Nokogiri解析JSON对象。Nokogiri用于解析XML/HTML。Facebook API的默认响应类型已经是JSON

更好地使用OpenURI和JSON.parse

这是关于卷曲的:

curl -i -H "Content-type: application/json" -H "Accept: application/json" -X GET \"https://graph.facebook.com/v2.8/me?fields=id%2Cname&access_token=<ACCESS_TOKEN>

我不知道为什么要使用Nokogiri解析JSON对象。Nokogiri用于解析XML/HTML。Facebook API的默认响应类型已经是JSON

更好地使用OpenURI和JSON.parse

这是关于卷曲的:

curl -i -H "Content-type: application/json" -H "Accept: application/json" -X GET \"https://graph.facebook.com/v2.8/me?fields=id%2Cname&access_token=<ACCESS_TOKEN>

通常,JSON响应不会编码或包含在HTML页面中,而是以文本字符串的形式返回,其中包含整个正文:

require 'open-uri'

open('http://httpbin.org/headers').read
# => "{\n" +
#    "  \"headers\": {\n" +
#    "    \"Accept\": \"*/*\", \n" +
#    "    \"Accept-Encoding\": \"gzip;q=1.0,deflate;q=0.6,identity;q=0.3\", \n" +
#    "    \"Host\": \"httpbin.org\", \n" +
#    "    \"User-Agent\": \"Ruby\"\n" +
#    "  }\n" +
#    "}\n"
将其解析回Ruby对象很容易:

require 'json'
require 'open-uri'

JSON[open('http://httpbin.org/headers').read]
# => {"headers"=>
#      {"Accept"=>"*/*",
#       "Accept-Encoding"=>"gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
#       "Host"=>"httpbin.org",
#       "User-Agent"=>"Ruby"}}
JSON[…]是解析JSON字符串或序列化Ruby对象的简单、通用的方法。它足够聪明,知道用哪种方法来做:

require 'json'

foo = {'a' => 1}
foo.class # => Hash
bar = JSON[foo] # => "{\"a\":1}"
bar.class # => String
baz = JSON[bar] # => {"a"=>1}
baz.class # => Hash
如果希望更明确,可以使用to_json和parse方法:

注意,在任何时候都不需要Nokogiri

如果出于某种奇怪的原因,JSON被注入到页面中,或者您可能想获取一些JavaScript数据,这是一种更可能的情况,那么您可以使用Nokogiri:

# Get the data
data = Nokogiri::HTML(open(<URL>))
require 'json'
require 'nokogiri'

html = <<EOT
<html>
  <head>
    <script>
      var foo = '{"a":1}';
    </script>
  </head>
</html>
EOT

doc = Nokogiri::HTML(html)
script_contents = doc.at('script').text # => "\n      var foo = '{\"a\":1}';\n    "
foo = JSON[script_contents[/({.+})/, 1]] # => {"a"=>1}
foo.class # => Hash

通常,JSON响应不会编码或包含在HTML页面中,而是以文本字符串的形式返回,其中包含整个正文:

require 'open-uri'

open('http://httpbin.org/headers').read
# => "{\n" +
#    "  \"headers\": {\n" +
#    "    \"Accept\": \"*/*\", \n" +
#    "    \"Accept-Encoding\": \"gzip;q=1.0,deflate;q=0.6,identity;q=0.3\", \n" +
#    "    \"Host\": \"httpbin.org\", \n" +
#    "    \"User-Agent\": \"Ruby\"\n" +
#    "  }\n" +
#    "}\n"
将其解析回Ruby对象很容易:

require 'json'
require 'open-uri'

JSON[open('http://httpbin.org/headers').read]
# => {"headers"=>
#      {"Accept"=>"*/*",
#       "Accept-Encoding"=>"gzip;q=1.0,deflate;q=0.6,identity;q=0.3",
#       "Host"=>"httpbin.org",
#       "User-Agent"=>"Ruby"}}
JSON[…]是解析JSON字符串或序列化Ruby对象的简单、通用的方法。它足够聪明,知道用哪种方法来做:

require 'json'

foo = {'a' => 1}
foo.class # => Hash
bar = JSON[foo] # => "{\"a\":1}"
bar.class # => String
baz = JSON[bar] # => {"a"=>1}
baz.class # => Hash
如果希望更明确,可以使用to_json和parse方法:

注意,在任何时候都不需要Nokogiri

如果出于某种奇怪的原因,JSON被注入到页面中,或者您可能想获取一些JavaScript数据,这是一种更可能的情况,那么您可以使用Nokogiri:

# Get the data
data = Nokogiri::HTML(open(<URL>))
require 'json'
require 'nokogiri'

html = <<EOT
<html>
  <head>
    <script>
      var foo = '{"a":1}';
    </script>
  </head>
</html>
EOT

doc = Nokogiri::HTML(html)
script_contents = doc.at('script').text # => "\n      var foo = '{\"a\":1}';\n    "
foo = JSON[script_contents[/({.+})/, 1]] # => {"a"=>1}
foo.class # => Hash

老实说,我以为nokogirl会在这种情况下被利用。我无法让法拉第工作,但httparty工作了。非常感谢。Ruby有许多有用的HTTP客户机。请参阅列表。@theTinMan hi刚刚尝试了你的答案,这也奏效了。谢谢,但这似乎是我在这个阶段的知识进步,这是基于很多来之不易的处理这个问题的经验。老实说,我认为nokogirl应该被用于这种情况。我无法让法拉第工作,但httparty工作了。非常感谢。Ruby有许多有用的HTTP客户机。请参阅列表。@theTinMan hi刚刚尝试了你的答案,这也奏效了。谢谢,但这似乎是我在这个阶段的知识进步,这是基于很多来之不易的处理这个问题的经验。