JSON Parsing
>>> from xsdata.formats.dataclass.context import XmlContext
>>> from xsdata.formats.dataclass.parsers import JsonParser
>>> from xsdata.formats.dataclass.parsers.config import ParserConfig
>>> config = ParserConfig()
>>> context = XmlContext()
>>> parser = JsonParser(context=context, config=config)
>>> parser = JsonParser()
Filenames
>>> from tests.fixtures.books.books import Books
...
>>> books = parser.parse("tests/fixtures/books/books.json", Books)
>>> books.book[0]
BookForm(author='Hightower, Kim', title='The First Book', genre='Fiction', price=44.95, pub_date=XmlDate(2000, 10, 1), review='An amazing story of nothing.', id='bk001', lang='en')
File-like objects
>>> with open("tests/fixtures/books/books.json", "rb") as fp:
... books = parser.parse(fp, Books)
>>> books.book[0]
BookForm(author='Hightower, Kim', title='The First Book', genre='Fiction', price=44.95, pub_date=XmlDate(2000, 10, 1), review='An amazing story of nothing.', id='bk001', lang='en')
String
>>> from pathlib import Path
>>>
>>> json_string = Path("tests/fixtures/books/books.json").read_text()
>>> books = parser.from_string(json_string, Books)
>>> books.book[0]
BookForm(author='Hightower, Kim', title='The First Book', genre='Fiction', price=44.95, pub_date=XmlDate(2000, 10, 1), review='An amazing story of nothing.', id='bk001', lang='en')
Bytes
>>> json_bytes = Path("tests/fixtures/books/books.json").read_bytes()
>>> books = parser.from_bytes(json_bytes, Books)
>>> books.book[0]
BookForm(author='Hightower, Kim', title='The First Book', genre='Fiction', price=44.95, pub_date=XmlDate(2000, 10, 1), review='An amazing story of nothing.', id='bk001', lang='en')
pathlib.Path
>>> file_path = Path("tests/fixtures/books/books.json")
>>> books = parser.from_path(file_path, Books)
>>> books.book[0]
BookForm(author='Hightower, Kim', title='The First Book', genre='Fiction', price=44.95, pub_date=XmlDate(2000, 10, 1), review='An amazing story of nothing.', id='bk001', lang='en')
Unknown target clazz
It's optimal to provide the target class but completely optional. The parser can scan all the imported modules to find a matching dataclass.
>>> order = parser.parse("tests/fixtures/books/books.json")
>>> type(order)
<class 'tests.fixtures.books.books.Books'>
Warning
The class locator searches for a dataclass that includes all the input object properties. This process doesn't work for documents with unknown properties even if the configuration option is disabled!
List of objects
Specify the target binding type to List[ModelName]
>>> from typing import List
>>> from tests.fixtures.books.books import BookForm
>>>
>>> json_string = """[
... {
... "author": "Hightower, Kim",
... "title": "The First Book",
... "genre": "Fiction",
... "price": 44.95,
... "pub_date": "2000-10-01",
... "review": "An amazing story of nothing.",
... "id": "bk001"
... },
... {
... "author": "Nagata, Suanne",
... "title": "Becoming Somebody",
... "genre": "Biography",
... "price": null,
... "pub_date": null,
... "review": "A masterpiece of the fine art of gossiping.",
... "id": "bk002"
... }
... ]"""
>>> booklist = parser.from_string(json_string, List[BookForm])
>>> booklist[1].author
'Nagata, Suanne'
Ignore unknown properties
By default the parser will fail on unknown properties, but you can disable these errors through configuration.
>>> config = ParserConfig(
... fail_on_unknown_properties=False,
... fail_on_unknown_attributes=False,
... )
>>> json_string = """{
... "author": "Hightower, Kim",
... "unknown_property": "I will fail"
... }"""
>>> parser = JsonParser(config=config)
>>> parser.from_string(json_string, BookForm)
BookForm(author='Hightower, Kim', title=None, genre=None, price=None, pub_date=None, review=None, id=None, lang='en')
Custom json load factory
The default factory is python's builtin :func:python:json.load
but you can use any other implementation as long as it has a compatible signature.
import ujson
parser = JsonParser(load_factory=ujson.load)