Skip to content

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