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 Responses
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 GitHub - devinus/poison: An incredibly fast, pure Elixir JSON library · GitHub, 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.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #javascript
- #podcasts
- #code-sync
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #advent-of-code
- #elixirconf-us
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #performance








