Skip to content

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.