Skip to content

Advanced Serialization with dsis-model-sdk

This guide shows how to deserialize DSIS API responses using dsis-model-sdk directly.

Installation

pip install dsis-model-sdk

Quick Start

The client provides cast_results() for convenience, but you can also use dsis-model-sdk directly:

from dsis_client import DSISClient, DSISConfig, QueryBuilder
from dsis_model_sdk.models.common import Basin

# Get data from API
client = DSISClient(config)
response = client.get(district_id="123", field="SNORRE", schema="Basin")

# Deserialize using dsis-model-sdk directly (recommended - fastest)
basins = [Basin(**item) for item in response["value"]]

# Or use client's helper
from dsis_client.api.models import cast_results
basins = cast_results(response["value"], Basin)

Three Ways to Deserialize

from dsis_model_sdk.models.common import Well

response = client.get(district_id="123", field="SNORRE", schema="Well")
wells = [Well(**item) for item in response["value"]]

2. Using Client's cast_results Helper

from dsis_client.api.models import cast_results, get_schema_by_name

# Option A: Import schema class directly
from dsis_model_sdk.models.common import Well
wells = cast_results(response["value"], Well)

# Option B: Get schema dynamically
Well = get_schema_by_name("Well")
wells = cast_results(response["value"], Well)

3. Using dsis-model-sdk's deserialize_from_json

Only use this if you have JSON strings (it's slower):

from dsis_model_sdk import deserialize_from_json
from dsis_model_sdk.models.common import Basin
import json

response = client.get(district_id="123", field="SNORRE", schema="Basin")
basins = []
for item in response["value"]:
    json_str = json.dumps(item)  # Convert to JSON string
    basin = deserialize_from_json(json_str, Basin)
    basins.append(basin)

With Error Handling

from dsis_model_sdk.models.common import Fault
from pydantic import ValidationError

response = client.get(district_id="123", field="SNORRE", schema="Fault")

faults = []
for idx, item in enumerate(response["value"]):
    try:
        faults.append(Fault(**item))
    except ValidationError as e:
        print(f"Skipping invalid fault at index {idx}: {e}")

print(f"Successfully deserialized {len(faults)} faults")

Using QueryBuilder with Auto-Cast

The easiest approach for most cases:

from dsis_client import QueryBuilder
from dsis_model_sdk.models.common import Basin

query = QueryBuilder(district_id="123", field="SNORRE").schema(Basin)
basins = client.execute_query(query, cast=True)  # Returns list of Basin objects

Performance Comparison

Method Speed Use When
Basin(**item) ⚡ Fastest Production, large datasets
cast_results(items, Basin) ⚡ Fast You want convenience
deserialize_from_json(json_str, Basin) 🐌 Slower You have JSON strings
QueryBuilder with cast=True ⚡ Fast Building queries

Recommendation: Use direct instantiation (Basin(**item)) for best performance.

See Also