ltgaxkeh

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

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

Eiji

You can’t do that directly, because you have list there. I will give you 4 example ways to achieve what you need:

  1. Get first item using List.first/1 or last item using List.last/1
  2. Get by specified index using Enum.at/2
  3. Iterate over list and do something for every item in it using Enum.each/2 or Enum.map/2 (depends on what you need).
  4. 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

sribe

I think it’s both. He’s struggling with creating an impossible pattern match in order to support an unworkable template structure.

Last Post!

Eiji

Eiji

@ltgaxkeh What you need is just use for not for another variable, but for field from dataFirst:

<table>
  <%= for dataFirst <- @FirstLevelJson do %>
    <tr>
      <td><%= dataFirst["Payor"] %></td>
      <td><%= dataFirst["RevenueSource"] %></td>
      <td><%= dataFirst["DateCreated"] %></td>
    </tr>
    <tr>
      <table>
        <%= for dataSecond <- dataFirst["InvoiceDetails"] do %>
          <tr>
            <td><%= dataSecond["TransactionDetails"] %></td>
            <td><%= dataSecond["TransCount"] %></td>
            <td><%= dataSecond["Rate"] %></td>
            <td><%= data["Total"] %></td>
            <td><%= data["Vat"] %></td>
            <td><%= data["Vatable"] %></td>
            <td><%= data["TotalAmount"] %></td>
          </tr>
        <% end %>
      </table>
    </tr>
  <% end %>
</table>

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
pmjoe
I have a relationship of love and hate with Elixir. Lots of things are just absolutely right, but there are some things that are kind of ...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New

Other popular topics Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
nsuchy
Hi. I’ve noticed that Windows Powershell has it’s own IEX command and you cannot access Elixir’s IEX due to the conflict. This isn’t a cr...
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 31525 112
New

We're in Beta

About us Mission Statement