ltgaxkeh
How to map multi level json
Hi again! How do I map a multi level json (response after HTTPoison.get)
Here’s my json:
[
{
"Payor": "ASMSI",
"RevenueSource": "NEW MEMBER",
"DateCreated": "2/1/2018 12:33:30 AM",
"InvoiceDetails": [
{
"TransactionDetails": "Dependent",
"TransCount": "45.00",
"Rate": "112",
"Total": "5040",
"Vat": "0.00",
"Vatable": "N",
"TotalAmount": "5040"
},
{
"TransactionDetails": "Extended Dependent",
"TransCount": "8.00",
"Rate": "112",
"Total": "896",
"Vat": "0.00",
"Vatable": "N",
"TotalAmount": "896"
},
{
"TransactionDetails": "Principal",
"TransCount": "22.00",
"Rate": "560",
So far I only got this idea from my controller:
%{"InvoiceDetails" => invoicedetails} = Poison.decode!(response.body)
Most Liked
idi527
Map to what exactly, what shape of data do you want? If you want to decode a json object into an elixir map, you can use a json decoder, there are several.
The most popular is probably https://github.com/devinus/poison, with it your code would be like this:
resp = HTTPoison.get!(url)
json = Poison.decode!(resp)
Here, json is an elixir term, probably a map. So you’d be able to use it to populate your table.
Eiji
You can’t do that directly, because you have list there. I will give you 4 example ways to achieve what you need:
- Get first item using
List.first/1or last item usingList.last/1 - Get by specified index using
Enum.at/2 - Iterate over list and do something for every item in it using
Enum.each/2orEnum.map/2(depends on what you need). - Find element which is interesting for you by using
Enum.find/2
For example:
list = Poison.decode!(response.body)
first_item = List.first(list)
last_item = List.last(list)
n = 10
nth_item = Enum.at(list, n) # where n is integer
found_item = Enum.find(list, & &1["Payor"] == "ASMSI")
# Then you can fetch specified data as you wanted:
%{"InvoiceDetails" => invoicedetails} = first_item
%{"InvoiceDetails" => invoicedetails} = last_item
%{"InvoiceDetails" => invoicedetails} = nth_item
%{"InvoiceDetails" => invoicedetails} = found_item
# Or do something for every item in list
defmodule Example do
def sample_each(list), do: Enum.each(list, &do_sample_each/1)
defp do_sample_each(%{"InvoiceDetails" => invoicedetails}), do: IO.inspect(invoicedetails)
def sample_map(list), do: Enum.map(list, &do_sample_map/1)
defp do_sample_map(%{"InvoiceDetails" => invoicedetails}), do: invoicedetails
end
:ok = Example.sample_each(list) # debugs "InvoiceDetails" for every item
invoicedetails_list = Example.sample_map(list) # returns list of invoicedetails
sribe
I think it’s both. He’s struggling with creating an impossible pattern match in order to support an unworkable template structure.
ltgaxkeh
Forgive me
I’m still a beginner in Elixir and MVC. I’m more of an OOP peep (.NET to be exact)
Perhaps, I’m having difficulty understanding but I’m willing to learn.
Anyway, a big thanks for the response and effort.
Is there an approach for a concern like this where a beginner like me can understand?
sribe
Just tell us whether our responses made sense to you, and if not, try your best to explain your thinking so we can take another try ![]()








