ID Properties
Basic IDs
Just like value objects, ID objects are supported via a custom class as well.
from pydantic_jsonld.expanded import BaseModel, Field, Id, Value
example = "http://www.example.org/"
class DatasetModel(BaseModel):
title: Value[str] = Field(..., prefix=example)
measured_property: Value[str] = Field(..., prefix=example)
instrument: Id = Field(..., prefix=example)
license: Id = Field(..., prefix=example)
data = [
{
"http://www.example.org/instrument": [
{"@id": "http://www.example.org/instrument/mauna-loa-sensor"}
],
"http://www.example.org/license": [
{"@id": "http://www.example.org/licenses/by/4.0/"}
],
"http://www.example.org/measuredPropery": [
{"@value": "CO2 concentration"}
],
"http://www.example.org/title": [
{"@value": "Atmospheric CO2 Measurements 2025"}
]
}
]
model = DatasetModel.model_validate(data)
assert model.title.value == "Atmospheric CO2 Measurements 2025"
assert model.measured_property.value == "CO2 concentration"
assert model.instrument.id == "http://www.example.org/instrument/mauna-loa-sensor"
assert model.license.id == "http://www.example.org/licenses/by/4.0/"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Id, Value
example = "http://www.example.org/"
class SoftwarePackageModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
version: Value[str] = Field(..., prefix=example)
homepage: Id = Field(..., prefix=example)
dependency: Id = Field(..., prefix=example)
data = [
{
"http://www.example.org/dependency": [
{"@id": "http://www.example.org/project/pydantic"}
],
"http://www.example.org/homepage": [
{"@id": "http://www.example.org/example/jsonld-compact"}
],
"http://www.example.org/name": [
{"@value": "jsonld-compact"}
],
"http://www.example.org/version": [
{"@value": "2.3.0",}
]
}
]
model = SoftwarePackageModel.model_validate(data)
assert model.name.value == "jsonld-compact"
assert model.version.value == "2.3.0"
assert model.homepage.id == "http://www.example.org/example/jsonld-compact"
assert model.dependency.id == "http://www.example.org/project/pydantic"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Id, Value
example = "http://www.example.org/"
class ExhibitModel(BaseModel):
title: Value[str] = Field(..., prefix=example)
creator: Id = Field(..., prefix=example)
location_found: Id = Field(..., prefix=example)
material: Value[str] = Field(..., prefix=example)
data = [
{
"http://www.example.org/creator": [
{"@id": "http://www.example.org/culture/unknown-bronze-age-smith"}
],
"http://www.example.org/locationFound": [
{"@id": "http://www.example.org/place/danube-valley"}
],
"http://www.example.org/material": [
{"@value": "Bronze"}
],
"http://www.example.org/title": [
{"@value": "Bronze Age Ritual Blade"}
]
}
]
model = ExhibitModel.model_validate(data)
assert model.title.value == "Bronze Age Ritual Blade"
assert model.creator.id == "http://www.example.org/culture/unknown-bronze-age-smith"
assert model.location_found.id == "http://www.example.org/place/danube-valley"
assert model.material.value == "Bronze"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
Complex IDs
Additional information provided in ID objects is captured as well.
from pydantic_jsonld.expanded import BaseModel, Field, Id, Value
example = "http://www.example.org/"
class DatasetModel(BaseModel):
title: Value[str] = Field(..., prefix=example)
measured_property: Value[str] = Field(..., prefix=example)
instrument: Id = Field(..., prefix=example)
license: Id = Field(..., prefix=example)
data = [
{
"http://www.example.org/instrument": [
{
"@id": "http://www.example.org/instrument/mauna-loa-sensor",
"@type": ["http://www.example.org/Sensor"],
}
],
"http://www.example.org/license": [
{
"@id": "http://www.example.org/licenses/by/4.0/",
"@type": ["http://www.example.org/CreativeWorkLicense"],
}
],
"http://www.example.org/measuredProperty": [
{"@value": "CO2 concentration"}
],
"http://www.example.org/title": [
{"@value": "Atmospheric CO2 Measurements 2025"}
]
}
]
model = DatasetModel.model_validate(data)
assert model.title.value == "Atmospheric CO2 Measurements 2025"
assert model.measured_property.value == "CO2 concentration"
assert model.instrument.id == "http://www.example.org/instrument/mauna-loa-sensor"
assert model.instrument.type == "http://www.example.org/Sensor"
assert model.license.id == "https://creativecommons.org/licenses/by/4.0/"
assert model.license.type == "http://www.example.org/CreativeWorkLicense"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Id, Value
example = "http://www.example.org/"
class SoftwarePackageModel(BaseModel):
name: Value[str] = Field(..., prefix=example)
version: Value[str] = Field(..., prefix=example)
homepage: Id = Field(..., prefix=example)
dependency: Id = Field(..., prefix=example)
data = [
{
"http://www.example.org/dependency": [
{
"@id": "http://www.example.org/project/pydantic",
"@type": ["http://www.example.org/SoftwareDependency"],
}
],
"http://www.example.org/homepage": [
{
"@id": "http://www.example.org/example/jsonld-compact",
"@type": ["http://www.example.org/WebPage"],
}
],
"http://www.example.org/name": [
{"@value": "jsonld-compact"}
],
"http://www.example.org/version": [
{"@value": "2.3.0"}
]
}
]
model = SoftwarePackageModel.model_validate(data)
assert model.name.value == "jsonld-compact"
assert model.version.value == "2.3.0"
assert model.homepage.id == "https://github.com/example/jsonld-compact"
assert model.homepage.type == "http://www.example.org/WebPage"
assert model.dependency.id == "https://pypi.org/project/pydantic"
assert model.dependency.type == "http://www.example.org/SoftwareDependency"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.expanded import BaseModel, Field, Id, Value
example = "http://www.example.org/"
class ExhibitModel(BaseModel):
title: Value[str] = Field(..., prefix=example)
creator: Id = Field(..., prefix=example)
location_found: Id = Field(..., prefix=example)
material: Value[str] = Field(..., prefix=example)
data = [
{
"http://www.example.org/creator": [
{
"@id": "http://www.example.org/culture/unknown-bronze-age-smith",
"@type": ["http://www.example.org/CulturalGroup"],
}
],
"http://www.example.org/locationFound": [
{
"@id": "http://www.example.org/place/danube-valley",
"@type": ["http://www.example.org/ArchaeologicalSite"],
}
],
"http://www.example.org/material": [
{"@value": "Bronze"}
],
"http://www.example.org/title": [
{"@value": "Bronze Age Ritual Blade"}
]
}
]
model = ExhibitModel.model_validate(data)
assert model.title.value == "Bronze Age Ritual Blade"
assert model.creator.id == "http://www.example.org/culture/unknown-bronze-age-smith"
assert model.creator.type == "http://www.example.org/CulturalGroup"
assert model.location_found.id == "http://www.example.org/place/danube-valley"
assert model.location_found.type == "http://www.example.org/ArchaeologicalSite"
assert model.material.value == "Bronze"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
ID Keywords
The keywords captured are @type and @index.