В схеме JSON, созданной на основе структуры msgspec
, я хочу вывести в схему некоторые текстовые описания свойств, содержащихся в структуре, так же, как строка документации структуры отображается в схеме JSON.
Этот небольшой игрушечный пример (вырезан из https://jcristharif.com/msgspec/jsonschema.html):
import json
import msgspec
from msgspec import Struct
def print_schema(schema):
encoded_schema = msgspec.json.encode(schema)
formatted_schema = json.dumps(json.loads(encoded_schema), indent=4)
print(formatted_schema)
class Product(Struct):
"""A product in a catalog"""
id: int
name: str
price: float
schema = msgspec.json.schema(Product)
print_schema(schema)
выходы:
{
"$ref": "#/$defs/Product",
"$defs": {
"Product": {
"title": "Product",
"description": "A product in a catalog",
"type": "object",
"properties": {
"id": {
"type": "integer"
},
"name": {
"type": "string"
},
"price": {
"type": "number"
}
},
"required": [
"id",
"name",
"price"
]
}
}
}
с description
, содержащим строку документации. Я хотел бы сделать что-то вроде
class Product(Struct):
"""A product in a catalog"""
id: int # DB uid
name: str # Name of product
price: float # Price of product
и комментарии будут отображаться в схеме JSON для соответствующего свойства. Возможно, что-то вроде:
{
"$ref": "#/$defs/Product",
"$defs": {
"Product": {
"title": "Product",
"description": "A product in a catalog",
"type": "object",
"properties": {
"id": {
"description": "DB uid"
"type": "integer"
},
"name": {
"description": "Name of product"
"type": "string"
},
"price": {
"description": "Price of product"
"type": "number"
}
},
"required": [
"id",
"name",
"price"
]
}
}
}
Однако я недостаточно знаю о схемах JSON, чтобы знать, правильно ли это или действительно, хотя, глядя на https://json-schema.org/learn/getting-started-step-by-step кажется, что это правильно. .
Как я могу это сделать, используя msgspec
? Или, может быть, переписать мой код, чтобы использовать pydantic
? Спасибо.
Сделанный. См. последнее редактирование вопроса.
это похоже на то, что вы ищете?
import json
from pydantic import BaseModel, Field
class Product(BaseModel):
"""A product in a catalog"""
id: int = Field(description = "DB uid")
name: str = Field(description = "Name of product")
price: float = Field(description = "Price of product")
product_schema = Product.model_json_schema()
json_product_schema = json.dumps(product_schema, indent=2)
С уверенностью в ответе https://stackoverflow.com/a/78703875/2746401 я покопался и узнал, как это сделать с помощью msgspec
from typing import Annotated
import json
import msgspec
from msgspec import Meta, Struct
def print_schema(schema):
encoded_schema = msgspec.json.encode(schema)
formatted_schema = json.dumps(json.loads(encoded_schema), indent=4)
print(formatted_schema)
class Product(Struct):
"""A product in a catalog"""
id: Annotated[int, Meta(description = "DB uid")]
name: Annotated[str, Meta(description = "Name of product")]
price: Annotated[float, Meta(description = "Price of product")]
schema = msgspec.json.schema(Product)
print_schema(schema)
Не могли бы вы указать точный результат, который вы хотели бы получить?