Extracting All Items of List Inside Map

Hello all!

A bit stumped on interpreting how to parse and extract my desired data from an API’s response with HTTPoison and Poison. I think I’m missing something simple.

Let’s say I want all the applicant names from “https://data.sfgov.org/resource/jjew-r69b.json?” .

In IEx-

iex(1)> res = HTTPoison.get!  "https://data.sfgov.org/resource/jjew-r69b.json?"

%HTTPoison.Response{
  body: "[{\"dayorder\":\"3\",\"dayofweekstr\":\"Wednesday\",\"starttime\":\"1PM\",\"endtime\":\"3PM\",\"permit\":\"19MFF-00079\",\"location\":\"1377 FELL ST\",\"locationdesc\":\"1:05pm-3:00pm\",\"optionaltext\":\"Cold Truck: Pre-packaged sandwiches, snacks, fruit, various beverages\"...

iex(2)> body = Poison.decode! res.body, keys: :atoms   

%{
    addr_date_create: "2017-07-31T15:11:15.000",
    addr_date_modified: "2017-08-01T10:49:12.000",
    applicant: "Bonito Poke",
    block: "3736",
    cnn: "107000",
    coldtruck: "N",
    dayofweekstr: "Wednesday",
    dayorder: "3",...

iex(3)> (hd body).applicant

"Liang Bai Ping"

As you can see from the JSON in the link, this is indeed the head, coming back to me in a string as I want after a bit of manipulation through HTTPoison and Poison. How would I go about calling and returning all of the heads and not just the head or tail?

Enum.map gives me nil

iex(4)> Enum.map(body, & &1["applicant"])
[nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
 nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
 nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,
 nil, nil, ...]

Thanks for any help :slight_smile:

In your Poison.decode! call you’re specifying keys: :atoms which constructs the resulting maps’ keys as atoms and not strings, but in your map call you’re providing a function which retrieves the field as it was a string (& &1[“applicant”]). I would recommend removing the keys: :atoms from the Poison.decode! call. Alternatively, you can do the same but with & &1.applicant.

1 Like

Ah yes! I got a bit turned around in the layers of changing the data. Thank you! Not sure what you mean by

Alternatively, you can do the same but with & &1.applicant.

?

Oh I just meant that the alternative solution, if, for some reason, you really need them as atoms, would be to keep the keys: :atoms in the Poison call, and to just change the function in the Enum.map call so that it retrieves the atoms via map.atom_field syntax (it’s equivalent to some_map[:atom_key]). And if you don’t need them as atoms, then you can simply remove the keys: :atoms from the Poison call. :slight_smile:

1 Like

Ah yes! Thanks for clarifying! :yellow_heart:

1 Like

@cloudytoday Related to this question, if you have any thoughts and care to share :slight_smile: