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.