Skip to content

Request parsers

In most cases, the default content type for REST API's is JSON, but in case you need to work with other content types (like YAML, XML, CSV) or use faster JSON parsers, Django Ninja provides a parser configuration.

api = NinjaAPI(parser=MyYamlParser())

To create your own parser, you need to extend the ninja.parser.Parser class, and override the parse_body method.

Example YAML Parser

Let's create our custom YAML parser:

import yaml
from typing import List
from ninja import NinjaAPI
from ninja.parser import Parser


class MyYamlParser(Parser):
    def parse_body(self, request):
        return yaml.safe_load(request.body)


api = NinjaAPI(parser=MyYamlParser())


class Payload(Schema):
    ints: List[int]
    string: str
    f: float


@api.post('/yaml')
def operation(request, payload: Payload):
    return payload.dict()

If you now send YAML like this as the request body:

ints:
 - 0
 - 1
string: hello
f: 3.14

it will be correctly parsed, and you should have JSON output like this:

{
  "ints": [
    0,
    1
  ],
  "string": "hello",
  "f": 3.14
}

Example ORJSON Parser

orjson is a fast, accurate JSON library for Python. It benchmarks as the fastest Python library for JSON and is more accurate than the standard json library or other third-party libraries.

pip install orjson

Parser code:

import orjson
from ninja import NinjaAPI
from ninja.parser import Parser


class ORJSONParser(Parser):
    def parse_body(self, request):
        return orjson.loads(request.body)


api = NinjaAPI(parser=ORJSONParser())