0

I am trying to parse through a JSON response for customer data (names and email) and construct a csv file with column headings of the same.

For some reason, every time I run this code I get a CSV file with a list of all the first names in one cell (with no separation in between the names...just a string of names appended to each other) and the same thing for the last name. The following code does not include adding emails (I'll worry about that later).

Code:

 def self.fetch_emails

    access_token ||= AssistlyArticle.remote_setup
    cust_response = access_token.get("https://blah.desk.com/api/v1/customers.json")
    cust_ids = JSON.parse(cust_response.body)["results"].map{|w| w["customer"]["id"].to_i}

 FasterCSV.open("/Users/default/file.csv", "wb") do |csv|
      # header row
      csv << ["First name", "Last Name"]
      # data rows
      cust_ids.each do |cust_firstname|
        json = JSON.parse(cust_response.body)["results"]
        csv << [json.map{|x| x["customer"]["first_name"]}, json.map{|x| x["customer"]["last_name"]}]
      end 
    end
  end

Output:

First Name        | Last Name
JohnJillJamesBill   SearsStevensSethBing

and so on...

Desired Output:

First Name | Last Name
John       | Sears
Jill       | Stevens
James      | Seth
Bill       | Bing

Sample JSON:

{
    "page":1,
    "count":20,
    "total":541,
    "results":
    [
        {
            "customer":
            {
                "custom_test":null,
                "addresses":
                [
                    {
                        "address":
                        {
                            "region":"NY",
                            "city":"Commack",
                            "location":"67 Harned Road,
                             Commack,
                             NY 11725,
                             USA",
                            "created_at":"2009-12-22T16:21:23-05:00",
                            "street_2":null,
                            "country":"US",
                            "updated_at":"2009-12-22T16:32:37-05:00",
                            "postalcode":"11725",
                            "street":"67 Harned Road",
                            "lng":"-73.196225",
                            "customer_contact_type":"home",
                            "lat":"40.716894"
                        }
                    }
                ],
                "phones":
                [
                ],
                "last_name":"Suriel",
                "custom_order":"4",
                "first_name":"Jeremy",
                "custom_t2":"",
                "custom_i":"",
                "custom_t3":null,
                "custom_t":"",
                "emails":
                [
                    {
                        "email":
                        {
                            "verified_at":"2009-11-27T21:41:11-05:00",
                            "created_at":"2009-11-27T21:40:55-05:00",
                            "updated_at":"2009-11-27T21:41:11-05:00",
                            "customer_contact_type":"home",
                            "email":"jeremysuriel+twitter@gmail.com"
                        }
                    }
                ],
                "id":8,
                "twitters":
                [
                    {
                        "twitter":
                        {
                            "profile_image_url":"http://a3.twimg.com...",
                            "created_at":"2009-11-25T10:35:56-05:00",
                            "updated_at":"2010-05-29T22:41:55-04:00",
                            "twitter_user_id":12267802,
                            "followers_count":93,
                            "verified":false,
                            "login":"jrmey"
                        }
                    }
                ]
            }
        },
        {
            "customer":
            {
                "custom_test":null,
                "addresses":
                [
                ],
                "phones":
                [
                ],
                "last_name":"",
                "custom_order":null,
                "first_name":"jeremy@example.com",
                "custom_t2":null,
                "custom_i":null,
                "custom_t3":null,
                "custom_t":null,
                "emails":
                [
                    {
                        "email":
                        {
                            "verified_at":null,
                            "created_at":"2009-12-05T20:39:00-05:00",
                            "updated_at":"2009-12-05T20:39:00-05:00",
                            "customer_contact_type":"home",
                            "email":"jeremy@example.com"
                        }
                    }
                ],
                "id":27,
                "twitters":
                [
                    null
                ]
            }
        }
    ]
}

Is there a better use of FasterCSV to allow this? I assumed that << would add to a new row each time...but it doesn't seem to be working. I would appreciate any help!

ns1
  • 117
  • 2
  • 3
  • 10
  • 2
    You forgot to show us a sample of the JSON. If the link you gave dies, the question will be worthless for people looking for a solution to a similar problem. Plus, you're forcing anyone who wants to help you to go dig it out and then find out it's a bogus request. – the Tin Man Sep 04 '12 at 17:41
  • You're right. My fault. I have added a sample of the JSON. Thanks for the tip. – ns1 Sep 04 '12 at 18:14
  • what version of ruby are you using? – Pritesh Jain Sep 04 '12 at 19:04

1 Answers1

1

You've got it all tangled up somehow, you're parsing the json too many times (and inside a loop!) Let's make it simpler:

customers = JSON.parse(data)["results"].map{|x| x['customer']}
customers.each do |c|
  csv << [c['first_name'], c['last_name']]
end

also 'wb' is the wrong mode for csv - just 'w'.

pguardiario
  • 53,827
  • 19
  • 119
  • 159