Skip to content

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.