datamodel-code-generator
datamodel-code-generator copied to clipboard
datamodel-codegen has issues with json schemas containing oneOf
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.
{
"$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']