【问题标题】:Convert JSON key values to CSV将 JSON 键值转换为 CSV
【发布时间】:2015-02-25 16:09:46
【问题描述】:

我的目标是读取一个 CSV 文件,从该文件的记录中获取每个 ID,将每个 ID 用于 Meetup API URL,然后使用 JSON 响应中的某些值创建一个新的 CSV 文件。

这是我目前所拥有的:

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

这是我得到的错误:

/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>'

你怎么看?

编辑

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

所以如果我只保留 JSON.parse(response.body) 就可以了,但是当我在 parseResponse 中添加 ['results'][0] 时,我得到了这个错误:

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

这是 JSON 结构,我想定位 [results][0].other_services.twitter.identifier

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

有什么想法吗?

【问题讨论】:

  • 你试过 http.use_ssl = true 吗?
  • 是的:/仍然有同样的错误
  • 我建议你减少你的问题代码。如果您需要“net/http”,然后省略 CSV、循环和 JSON,会发生什么?例如,如果您尝试仅获取一个成员,您会得到什么响应正文?

标签: ruby json csv


【解决方案1】:

#use_ssl= 为 HTTP 连接启用了 HTTPS

此代码使用 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

在以前的 Ruby 版本中,您需要 require 'net/https' 才能使用 HTTPS。这是no longer true

你能在你的系统上试试上面的代码吗?

如果它有效,那就太好了。如果它不起作用,那么您可以简化您的问题代码,例如省略 CSV、循环、JSON 等。

【讨论】:

  • 编辑更多,如果可以的话,用最不可能的代码触发错误。此外,从 require 'net/https' 更改为 'net/http'。您可能希望省略您的 API 密钥。
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2020-08-30
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多