Basic Usage
Getting Started
For the most basic usage, see the following example.
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
# Define a model
class PersonModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
age: Value[int] = Field(..., prefix=example)
# Build an instance from JSON-LD data
data = [
{
"http://www.example.org/age": [{"@value": 30}],
"http://www.example.org/name": [{"@value": "Alice"}],
}
]
model = PersonModel.model_validate(data)
# Access via model properties
assert model.name.value == "Alice"
assert model.age.value == 30
# Recover the original data
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Field, Value
example = "http://www.example.org/"
# Define a model
class AreaModel(BaseModel):
height: Value[float] = Field(..., prefix=example)
length: Value[float] = Field(..., prefix=example)
# Build an instance from JSON-LD data
data = [
{
"http://www.example.org/height": [{"@value": 20}],
"http://www.example.org/length": [{"@value": 10}],
}
]
model = AreaModel.model_validate(data)
# Access via model properties
assert model.height.value == 20.0
assert model.length.value == 10.0
# Recover the original data
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Field, Value
example = "http://www.example.org/"
# Define a model
class ProductModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
price: Value[float] = Field(..., prefix=example)
in_stock: Value[bool] = Field(..., prefix=example)
# Build an instance from JSON-LD data
data = [
{
"http://www.example.org/inStock": [{"@value": False}],
"http://www.example.org/name": [{"@value": "Notebook"}],
"http://www.example.org/price": [{"@value": 12.99}]
}
]
model = ProductModel.model_validate(data)
# Access via model properties
assert model.name.value == "Notebook"
assert model.price.value == 12.99
assert model.in_stock.value is False
# Recover the original data
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
Complex Values
Additional information provided in value objects is captured as well.
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
class PersonModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
age: Value[int] = Field(..., prefix=example)
data = [
{
"http://www.example.org/age": [
{
"@type": "http://www.w3.org/2001/XMLSchema#integer",
"@value": 30,
}
],
"http://www.example.org/name": [
{
"@language": "en",
"@value": "Alice",
}
]
}
]
model = PersonModel.model_validate(data)
assert model.name.value == "Alice"
assert model.name.language == "en"
assert model.age.value == 30
assert model.age.type == "http://www.w3.org/2001/XMLSchema#integer"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
class AreaModel(BaseModel):
height: Value[float] = Field(..., prefix=example)
length: Value[float] = Field(..., prefix=example)
data = [
{
"http://www.example.org/height": [
{
"@type": "http://www.w3.org/2001/XMLSchema#double",
"@value": 20
}
],
"http://www.example.org/length": [
{
"@type": "http://www.w3.org/2001/XMLSchema#double",
"@value": 10
}
]
}
]
model = AreaModel.model_validate(data)
assert model.height.value == 20.0
assert model.height.type == "http://www.w3.org/2001/XMLSchema#double"
assert model.length.value == 10.0
assert model.length.type == "http://www.w3.org/2001/XMLSchema#double"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
class ProductModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
price: Value[float] = Field(..., prefix=example)
in_stock: Value[bool] = Field(..., prefix=example)
data = [
{
"http://www.example.org/inStock": [
{
"@type": "http://www.w3.org/2001/XMLSchema#boolean",
"@value": False,
}
],
"http://www.example.org/name": [
{
"@language": "en",
"@value": "Notebook",
}
],
"http://www.example.org/price": [
{
"@type": "http://www.w3.org/2001/XMLSchema#decimal",
"@value": 12.99,
}
]
}
]
model = ProductModel.model_validate(data)
assert model.name.value == "Notebook"
assert model.name.language == "en"
assert model.price.value == 12.99
assert model.price.type == "http://www.w3.org/2001/XMLSchema#decimal"
assert model.in_stock.value is False
assert model.in_stock.type == "http://www.w3.org/2001/XMLSchema#boolean"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
Value Keywords
The keywords captured are @type, @language, @direction, and @index.
Optional Properties
Optional properties can be defined in the same way as in regular pydantic.
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
class PersonModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
age: Value[int] | None = Field(None, prefix=example)
data = [
{
"http://www.example.org/name": [{"@value": "Alice"}],
}
]
model = PersonModel.model_validate(data)
assert model.name.value == "Alice"
assert model.age is None
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
class AreaModel(BaseModel):
height: Value[float] = Field(..., prefix=example)
length: Value[float] | None = Field(None, prefix=example)
data = [
{
"http://www.example.org/height": [{"@value": 20}],
}
]
model = AreaModel.model_validate(data)
assert model.height.value == 20.0
assert model.length is None
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Value
example = "http://www.example.org/"
class ProductModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
price: Value[float] = Field(..., prefix=example)
in_stock: Value[bool] | None = Field(None, prefix=example)
data = [
{
"http://www.example.org/name": [{"@value": "Notebook"}],
"http://www.example.org/price": [{"@value": 12.99}],
}
]
model = ProductModel.model_validate(data)
assert model.name.value == "Notebook"
assert model.price.value == 12.99
assert model.in_stock is None
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data