List Properties
Basic Lists
List properties are supported as well.
from pydantic_jsonld.compact import BaseModel, Value
class BookModel(BaseModel):
title: Value[str]
pages: Value[int]
authors: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"title": {
"@value": "Semantic Web Basics",
"@language": "en",
},
"pages": 320,
"authors": [
"Alice Smith",
"Bob Johnson",
],
}
model = BookModel.model_validate(data)
assert model.title.value == "Semantic Web Basics"
assert model.pages.value == 320
assert model.authors[0].value == "Alice Smith"
assert model.authors[1].value == "Bob Johnson"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Value
class SensorDeviceModel(BaseModel):
id: Value[str]
temperature: Value[float]
alerts: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"id": "sensor-42",
"temperature": 21.5,
"alerts": [
"battery-low",
"calibration-required",
],
}
model = SensorDeviceModel.model_validate(data)
assert model.id.value == "sensor-42"
assert model.temperature.value == 21.5
assert model.alerts[0].value == "battery-low"
assert model.alerts[1].value == "calibration-required"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Value
class EventModel(BaseModel):
name: Value[str]
attendees: Value[int]
tags: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"name": {
"@value": "AI Conference 2026",
"@language": "en"
},
"attendees": 1500,
"tags": [
"ai",
"machine-learning",
"semantic-web",
],
}
model = EventModel.model_validate(data)
assert model.name.value == "AI Conference 2026"
assert model.attendees.value == 1500
assert model.tags[0].value == "ai"
assert model.tags[1].value == "machine-learning"
assert model.tags[2].value == "semantic-web"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
List Keyword
This is different from the @list keyword
which is currently not supported yet.
Single-Element Lists
Lists with only a single element that were collapsed are handled properly.
from pydantic_jsonld.compact import BaseModel, Value
class BookModel(BaseModel):
title: Value[str]
pages: Value[int]
authors: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"title": {
"@value": "Semantic Web Basics",
"@language": "en",
},
"pages": 320,
"authors": "Alice Smith",
}
model = BookModel.model_validate(data)
assert model.title.value == "Semantic Web Basics"
assert model.pages.value == 320
assert model.authors[0].value == "Alice Smith"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Value
class SensorDeviceModel(BaseModel):
id: Value[str]
temperature: Value[float]
alerts: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"id": "sensor-42",
"temperature": 21.5,
"alerts": "battery-low",
}
model = SensorDeviceModel.model_validate(data)
assert model.id.value == "sensor-42"
assert model.temperature.value == 21.5
assert model.alerts[0].value == "battery-low"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Value
class EventModel(BaseModel):
name: Value[str]
attendees: Value[int]
tags: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"name": {
"@value": "AI Conference 2026",
"@language": "en",
},
"attendees": 1500,
"tags": "ai",
}
model = EventModel.model_validate(data)
assert model.name.value == "AI Conference 2026"
assert model.attendees.value == 1500
assert model.tags[0].value == "ai"
dumped = model.model_dump(by_alias=True, exclude_none=True)
assert dumped == data
If you don't want such lists to be collapsed upon dumping, you can do the following.
from pydantic_jsonld.compact import BaseModel, Value
class BookModel(BaseModel):
title: Value[str]
pages: Value[int]
authors: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"title": {
"@value": "Semantic Web Basics",
"@language": "en",
},
"pages": 320,
"authors": [
"Alice Smith",
],
}
model = BookModel.model_validate(data)
assert model.title.value == "Semantic Web Basics"
assert model.pages.value == 320
assert model.authors[0].value == "Alice Smith"
dumped = model.model_dump(
by_alias=True,
exclude_none=True,
context={"compact_arrays": False},
)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Value
class SensorDeviceModel(BaseModel):
id: Value[str]
temperature: Value[float]
alerts: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"id": "sensor-42",
"temperature": 21.5,
"alerts": [
"battery-low",
],
}
model = SensorDeviceModel.model_validate(data)
assert model.id.value == "sensor-42"
assert model.temperature.value == 21.5
assert model.alerts[0].value == "battery-low"
dumped = model.model_dump(
by_alias=True,
exclude_none=True,
context={"compact_arrays": False},
)
assert dumped == data
from pydantic_jsonld.compact import BaseModel, Value
class EventModel(BaseModel):
name: Value[str]
attendees: Value[int]
tags: list[Value[str]]
data = {
"@context": {"@vocab": "http://www.example.org/"},
"name": {
"@value": "AI Conference 2026",
"@language": "en",
},
"attendees": 1500,
"tags": [
"ai",
],
}
model = EventModel.model_validate(data)
assert model.name.value == "AI Conference 2026"
assert model.attendees.value == 1500
assert model.tags[0].value == "ai"
dumped = model.model_dump(
by_alias=True,
exclude_none=True,
context={"compact_arrays": False},
)
assert dumped == data
Per Property Compaction
There is currently no way to disable compaction only for certain properties.