gilles
gilles

Reputation: 97

Convert JSON key values to CSV

My goal is to read a CSV file, get each ID from that file's records, use each ID into the Meetup API URL and then create a new CSV file with certain values from the JSON response.

Here's what I have so far:

require "net/https"
require "uri"
require 'csv'
require 'json'

membersCSV = CSV.foreach('id-members-meetup.csv') do |row|
id = row[1]
uri = URI.parse("https://api.meetup.com/2/members?order=name&member_id=" + id + "&format=json&key=MY_KEY")
http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new(uri.request_uri)
response = http.request(request)
CSV.open("ghmeetup.csv", "w", {:col_sep => ";"}) do |csv|
  JSON.parse(response.body)["other_services"].each do |single|
    csv << [single["twitter"]["identifier"], single["facebook"]["identifier"], single["linkedin"]["identifier"]]
  end
end
end

And this is the error I get:

/Library/Ruby/Gems/2.0.0/gems/json-1.8.2/lib/json/common.rb:155:in `parse': 757: (JSON::ParserError) '<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>cloudflare-nginx</center>
</body>
</html>
'
    from /Library/Ruby/Gems/2.0.0/gems/json-1.8.2/lib/json/common.rb:155:in `parse'
    from ghmeetup.rb:13:in `block (2 levels) in <main>'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/csv.rb:1266:in `open'
    from ghmeetup.rb:12:in `block in <main>'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/csv.rb:1716:in `each'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/csv.rb:1120:in `block in foreach'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/csv.rb:1266:in `open'
    from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/csv.rb:1119:in `foreach'
    from ghmeetup.rb:6:in `<main>'

What do you think?

EDIT

require "uri"
require 'csv'
require 'json'
require 'net/http'

ghCSV = CSV.foreach('id-gh-meetup.csv') do |row|
    id = row[1]
    key="KEY" 
    uri = URI.parse("https://api.meetup.com/2/members?order=name&member_id=#{id}&format=json&key=#{key}")
    Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
    request = Net::HTTP::Get.new uri
    response = http.request request
    parseResponse = JSON.parse(response.body)['results'][0]
    p "working"
      CSV.open("ghmeetup.csv", "w") do |csv|
        p "working 2"       
            parseResponse.each do |single|
                p "working 3"
              csv << single
            end
        end
    end
end

So it works if I keep only JSON.parse(response.body) but when I add ['results'][0] in parseResponse I get this error:

ghmeetup.rb:15:in `block (2 levels) in <main>': undefined method `[]' for nil:NilClass (NoMethodError)

This is the JSON structure, I want to target [results][0].other_services.twitter.identifier

{
results: [
 - {
   - other_services: {
      twitter: {
        identifier: "@HugoAmsellem"

Any idea?

Upvotes: 1

Views: 294

Answers (1)

joelparkerhenderson
joelparkerhenderson

Reputation: 35443

HTTPS is enabled for an HTTP connection by #use_ssl=

This code gets a successful response on my system using Ruby 2.2.0:

require 'net/http'  # Not HTTPS
key="..."  # Get your personal API key from Meetup
uri = URI.parse("https://api.meetup.com/2/members?order=name&member_id=1&format=json&key=#{key}")
Net::HTTP.start(uri.host, uri.port, use_ssl: true) do |http|
  request = Net::HTTP::Get.new uri
  response = http.request request
  p response.body
end

In previous versions of Ruby you would need to require 'net/https' to use HTTPS. This is no longer true.

Can you try the code above on your system?

If it works, great. If it doesn't work, then you can simplify your question code, such as omitting the CSV, the loop, the JSON, etc.

Upvotes: 1

Related Questions