JSON ModelingΒΆ

The code generator supports processing json documents directly. That means even without a schema you can easily create at the very least an initial draft of your models just from samples. If you use a directory with multiple samples the transformer will merge and flatten duplicate classes, fields and field types.

$ xsdata --package tests.fixtures.series tests/fixtures/series/samples
{
  "id": 2,
  "name": "Person of Interest",
  "type": "Scripted",
  "language": "English",
  "genres": [
    "Action",
    "Crime",
    "Science-Fiction"
  ],
  "status": "Ended",
  "runtime": 60,
  "premiered": "2011-09-22",
  "officialSite": "http://www.cbs.com/shows/person_of_interest/",
  "schedule": {
    "time": "22:00",
    "days": [
      "Tuesday"
    ]
  },
  "rating": {
    "average": 8.9
  },
  "network": {
    "id": 2,
    "name": "CBS",
    "country": {
      "name": "United States",
      "code": "US",
      "timezone": "America/New_York"
    }
  },
  "webChannel": null,
  "externals": {
    "tvrage": 28376,
    "imdb": "tt1839578"
  },
  "summary": "<p>You are being watched. The government has a secret system, a machine that spies on you every hour of every day. I know because I built it. I designed the Machine to detect acts of terror but it sees everything. Violent crimes involving ordinary people. People like you. Crimes the government considered \"irrelevant\". They wouldn't act so I decided I would. But I needed a partner. Someone with the skills to intervene. Hunted by the authorities, we work in secret. You'll never find us. But victim or perpetrator, if your number is up, we'll find you.</p>",
  "updated": 1588773151
}
{
  "id": 5,
  "url": "https://www.tvmaze.com/shows/5/true-detective",
  "name": "True Detective",
  "type": "Scripted",
  "language": "English",
  "genres": [
    "Drama",
    "Crime",
    "Thriller"
  ],
  "status": "Running",
  "runtime": 60,
  "premiered": "2014-01-12",
  "officialSite": "http://www.hbo.com/true-detective",
  "schedule": {
    "time": "21:00",
    "days": [
      "Sunday"
    ]
  },
  "rating": {
    "average": 8.3
  },
  "weight": 97,
  "network": {
    "name": "HBO",
    "country": {
      "name": "United States",
      "code": "US"
    }
  },
  "externals": {
    "tvrage": 31369,
    "thetvdb": 270633,
    "imdb": "tt2356777"
  },
  "image": {
    "medium": "https://static.tvmaze.com/uploads/images/medium_portrait/178/445621.jpg",
    "original": "https://static.tvmaze.com/uploads/images/original_untouched/178/445621.jpg"
  },
  "summary": "<p>Touch darkness and darkness touches you back. <b>True Detective</b> centers on troubled cops and the investigations that drive them to the edge. Each season features a new cast and a new case.</p>",
  "updated": 1614762066,
  "_links": {
    "self": {
      "href": "https://api.tvmaze.com/shows/5"
    },
    "previousepisode": {
      "href": "https://api.tvmaze.com/episodes/1590271"
    }
  }
}
from dataclasses import dataclass, field
from typing import List, Optional
from xsdata.models.datatype import XmlDate


@dataclass
class Country:
    class Meta:
        name = "country"

    name: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    code: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    timezone: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Externals:
    class Meta:
        name = "externals"

    tvrage: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    thetvdb: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    imdb: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Image:
    class Meta:
        name = "image"

    medium: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    original: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Previousepisode:
    class Meta:
        name = "previousepisode"

    href: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Rating:
    class Meta:
        name = "rating"

    average: Optional[float] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Schedule:
    class Meta:
        name = "schedule"

    time: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    days: List[str] = field(
        default_factory=list,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Self:
    class Meta:
        name = "self"

    href: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Links:
    class Meta:
        name = "_links"

    self_value: Optional[Self] = field(
        default=None,
        metadata={
            "name": "self",
            "type": "Element",
        }
    )
    previousepisode: Optional[Previousepisode] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Network:
    class Meta:
        name = "network"

    id: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    name: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    country: Optional[Country] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )


@dataclass
class Series:
    class Meta:
        name = "series"

    id: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    url: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    name: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    type: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    language: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    genres: List[str] = field(
        default_factory=list,
        metadata={
            "type": "Element",
        }
    )
    status: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    runtime: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    premiered: Optional[XmlDate] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    official_site: Optional[str] = field(
        default=None,
        metadata={
            "name": "officialSite",
            "type": "Element",
        }
    )
    schedule: Optional[Schedule] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    rating: Optional[Rating] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    weight: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    network: Optional[Network] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    web_channel: Optional[object] = field(
        default=None,
        metadata={
            "name": "webChannel",
            "type": "Element",
        }
    )
    externals: Optional[Externals] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    image: Optional[Image] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    summary: Optional[str] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    updated: Optional[int] = field(
        default=None,
        metadata={
            "type": "Element",
        }
    )
    links: Optional[Links] = field(
        default=None,
        metadata={
            "name": "_links",
            "type": "Element",
        }
    )