datamodel-code-generator icon indicating copy to clipboard operation
datamodel-code-generator copied to clipboard

datamodel-codegen has issues with json schemas containing oneOf

Open Benjamin-Berger opened this issue 3 years ago • 0 comments
trafficstars

Description

When running datamodel-codegen --input example_schema.json --input-file-type jsonschema --output model.py

On my file it will not grab all the necessary fields. You'll notice in the Example Code, Field 1 is not present anywhere.

v2_test
{
    "$schema": "https://json-schema.org/draft/2019-09/schema",
    "type": "object",
    "title": "v2_test",
    "additionalProperties": true,
    "oneOf": [
        {
            "type": "object",
            "properties": {
                "field_1": {
                    "enum": [
                        "response_1"
                    ]
                }
            },
            "additionalProperties": true,
            "oneOf": [
                {
                    "type": "object",
                    "properties": {
                        "field_2": {
                            "enum": [
                                "response_a"
                            ]
                        }
                    },
                    "additionalProperties": true,
                    "required": [
                        "field_2"
                    ]
                }
            ],
            "required": [
                "field_1"
            ]
        },
        {
            "type": "object",
            "properties": {
                "field_1": {
                    "enum": [
                        "response_2"
                    ]
                }
            },
            "additionalProperties": true,
            "oneOf": [
                {
                    "type": "object",
                    "properties": {
                        "field_2": {
                            "enum": [
                                "response_b"
                            ]
                        }
                    },
                    "additionalProperties": true,
                    "required": [
                        "field_2"
                    ]
                },
                {
                    "type": "object",
                    "properties": {
                        "field_2": {
                            "enum": [
                                "response_c"
                            ]
                        }
                    },
                    "additionalProperties": true,
                    "required": [
                        "field_2"
                    ]
                }
            ],
            "required": [
                "field_1"
            ]
        }
    ]
}

Example Code

# generated by datamodel-codegen:
#   filename:  v2_differnet_names_schema.json
#   timestamp: 2022-08-21T09:12:26+00:00

from __future__ import annotations

from enum import Enum
from typing import Union

from pydantic import BaseModel, Extra, Field


class Field2(Enum):
    response_a = 'response_a'


class V2TestItem(BaseModel):
    class Config:
        extra = Extra.allow

    field_2: Field2


class Field21(Enum):
    response_b = 'response_b'


class V2TestItem1(BaseModel):
    class Config:
        extra = Extra.allow

    field_2: Field21


class Field22(Enum):
    response_c = 'response_c'


class V2TestItem2(BaseModel):
    class Config:
        extra = Extra.allow

    field_2: Field22


class V2Test(BaseModel):
    class Config:
        extra = Extra.allow

    __root__: Union[V2TestItem, Union[V2TestItem1, V2TestItem2]] = Field(
        ..., title='v2_test'
    )

Python, Pydantic & OS Version

pydantic version: 1.9.1
            pydantic compiled: True
                 install path: /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pydantic
               python version: 3.10.5 (v3.10.5:f377153967, Jun  6 2022, 12:36:10) [Clang 13.0.0 (clang-1300.0.29.30)]
                     platform: macOS-12.1-arm64-arm-64bit
     optional deps. installed: ['email-validator', 'typing-extensions']

Benjamin-Berger avatar Aug 22 '22 13:08 Benjamin-Berger