Phoenix wrapping array request inside _json field

Phoenix automatically wraps array request inside a _json field and make it an object. eg I am sending below body

 [ { "activity_model_id": "{{activity_model_id}}", "context": "scan shop ABC", "card_id": "{{card_id}}" }, { "activity_model_id": "{{activity_model_id}}", "context": "checking home", "card_id": "{{card_id}}" } ] 

when I inspect/print raw body via a middleware(just for debugging purpose), raw body is correct and matched which is

" [\n {\n \"activity_model_id\": \"{{activity_model_id}}\",\n \"context\": \"scan shop ABC\",\n \"card_id\": \"73c0da33-89d1-4f2f-9af1-3e282c3a9606\"\n },\n {\n \"activity_model_id\": \"{{activity_model_id}}\",\n \"context\": \"checking home\",\n \"card_id\": \"73c0da33-89d1-4f2f-9af1-3e282c3a9606\"\n }\n]" 

But what I actually see in the logs which is being sent to controllers is

Parameters: %{"_json" => [%{"activity_model_id" => "{{activity_model_id}}", "card_id" => "73c0da33-89d1-4f2f-9af1-3e282c3a9606", "context" => "scan shop ABC"}, %{"activity_model_id" => "{{activity_model_id}}", "card_id" => "73c0da33-89d1-4f2f-9af1-3e282c3a9606", "context" => "checking home"}]} 

You can see, just before sending body to params, extra _json field is introduced from somewhere.
I also have this config:

config :phoenix, :json_library, Jason 

So either this field is introduced by Jason or phoenix itself. currently having no clue, how to get correct request without _json field in controllers. any help is really appreciated. Thanks

This is not phoenix doing it, it is documented behaviour of Plug.Parsers.JSON:

JSON documents that aren’t maps (arrays, strings, numbers, etc) are parsed into a "_json" key to allow proper param merging.

1 Like

Can we avoid it? and get all the params as it is

You cannot because conn.params is a map. So if we set it to a list, other parts of plug will fail. But the list is store as is under _json. You can also disable Plug.Parsers.JSON and roll your own parser.