Search code examples
rubyjsongdatajekyllliquid

How can I access an array of objects from GData JSON in Ruby?


I am trying to write a Jekyll extension that will embed comments from a Blogger blog.
I am able to fetch the comments feed as JSON, and process it enough to pull out the total number of comments. However, I have not figured out how to process each comment in the feed.

json_url = "http://www.blogger.com/feeds/8505008/593465383646513269/comments/default/?alt=json"
json_rep = Net::HTTP.get_response(json_url)
json_rep = JSON.parse(json_rep.body)
json_rep['feed']['openSearch$totalResults']['$t'] # => "4"
json_rep['feed']['entry'].class # => Array

json_rep['feed']['entry'].length
# => Liquid Exception: undefined method `length' for nil:NilClass in post

This is my first time writing any code in Ruby. What am I doing wrong?

Here are the relevant parts of the JSON I am trying to parse.

{
  "feed": {
    "openSearch$totalResults": {
      "$t": "4"
    },
    "entry": [
      {
        "id": {
          "$t": "tag:blogger.com,1999:blog-8505008.post-491866073982779922"
        },
        "published": {
          "$t": "2013-01-08T15:23:47.322-04:00"
        },
        "content": {
          "type": "html",
          "$t": "Recently, my sister has updated it more than I have. \u00dcber-fail on my part. :p"
        }
      }
    ]
  }
}

Solution

  • This is what you should look at doing:

    require 'rubygems'
    require 'json'
    require 'net/http'
    require 'net/https'
    require 'uri'
    
    url = "http://www.blogger.com/feeds/8505008/593465383646513269/comments/default/?alt=json"
    uri = URI.parse(url)
    http = Net::HTTP.new(uri.host, uri.port)
    request = Net::HTTP::Get.new(uri.request_uri)
    response = http.request(request)
    
    json_rep = JSON.parse(response.body)
    
    puts json_rep['feed']['openSearch$totalResults']['$t']
    
    entries = json_rep['feed']['entry']
    entries.each do |entry|
        puts entry["id"]["$t"]
        #add what ever code you like here
    end 
    

    This outputs:

    4
    tag:blogger.com,1999:blog-8505008.post-491866073982779922
    tag:blogger.com,1999:blog-8505008.post-4792479891671746788
    tag:blogger.com,1999:blog-8505008.post-4766604955439002209
    tag:blogger.com,1999:blog-8505008.post-5484003770204916000