elixirjsonparserelixir-poison

Map JSON values in Elixir


I have parsed the following JSON using Posion.decode!

json = %{"color-Black|size:10" => 
    %{"attributes" => %{"color" => "Black","size" => "11"},    
      "isAvailable" => true,      
    "pricing" => %{"standard" => "$415.00", "sale" => 415}}, 
 "color|size-EU:9.5" => 
    %{"attributes" => %{"color" => "Black","size" => "11"},    
      "isAvailable" => true,      
    "pricing" => %{"standard" => "$415.00", "sale" => 415}}}

I want to map this and I'm unable to get JSON elements as the text in the node element changes. So far I've tried.

Enum.map(json , fn(item) ->
%{
  color: item.attributes["color"],                 
  size: item.attributes["size"],
  price: item.pricing["standard"] * 100,
  isAvailable: item.isAvailable
 }
end)

But this code gives some error related to accessing.


Solution

  • While mapping the map, the iterated key-value pairs come to the mapper as tuples {key, value}:

    Enum.map(json, fn {_, %{"attributes" => attributes,
                            "isAvailable" => isAvailable,
                            "pricing" => pricing}} ->
      %{
        color: attributes["color"],
        size: attributes["size"],
        price: pricing["standard"],
        isAvailable: isAvailable
       }
    end)
    
    #⇒ [
    #    %{color: "Black", isAvailable: true, price: "$415.00", size: "11"},
    #    %{color: "Black", isAvailable: true, price: "$415.00", size: "11"}
    # ]
    

    Here we use an inplace pattern matching for values in mapper to simplify the code of matcher itself and make it less error-prone in a case of bad input.