Is it possible to get pydantic v2 to dump json with sorted keys? – Json

by
Alexei Petrov
angular-json pydantic python

Quick Fix: Utilize Python’s dictionaries ordered structure. Serialize your pydantic model to a dictionary and apply sorting to the keys before dumping it as JSON.

The Problem:

In pydantic versions prior to v2, there was an option to use a dumps_kwargs parameter which allowed for customizing the output of the json.dumps function when serializing data. However, in pydantic v2, this functionality is no longer available.

This presents a challenge, as there are specific scenarios where you might want to sort the keys in the resulting JSON. While there is a workaround involving using dict() and model_dump() for simple objects, this approach falls short when dealing with complex data types.

The question is: how can you sort the keys in the JSON output of a pydantic model in version 2?

The Solutions:

Solution 1: Leverage Python’s Ordered Dictionaries

To achieve sorted JSON keys with Pydantic v2, you can leverage Python’s ordered dictionaries, which preserve the order of elements since Python 3.7. Here’s how:

  1. Import Necessary Modules:
from typing import Any, Dict
from pydantic import BaseModel, model_serializer
  1. Define Your Model:
class JsonTest(BaseModel):
    b_field: int
    c_field: int
    a_field: str
  1. Create a Model Serializer:
@model_serializer(when_used='json')
def sort_model(self) -> Dict[str, Any]:
    return dict(sorted(self.model_dump().items()))
  • sort_model is a model serializer that will be used when serializing the model to JSON.
  • self.model_dump() returns a dictionary representation of the model.
  • sorted(self.model_dump().items()) sorts the dictionary items based on their keys.
  • dict() converts the sorted list of tuples back into a dictionary.
  1. Use the Model Serializer:
obj = JsonTest(b_field=1, a_field="one", c_field=0)
print(obj.model_dump_json())
  • The model_dump_json() method uses the sort_model serializer to serialize the model to JSON.

This approach utilizes Python’s ordered dictionaries to achieve sorted JSON keys while preserving the model’s functionality.

Solution 2: Using `model_dump()` and `json.dumps()`

To get sort_keys to work in pydantic v2, you can use the following approach:

  1. Utilize the model_dump() method to get a dictionary representation of the Pydantic model.
  2. Employ the json.dumps() function with the sort_keys=True parameter to sort the keys alphabetically in the resulting JSON string.

This strategy ensures that the JSON output has sorted keys, even for complex data types that pydantic can serialize.

import json
from pydantic import BaseModel

class JsonTest(BaseModel):
    b_field: int
    a_field: str

obj = JsonTest(b_field=1, a_field="one")

# Use model_dump to get a dictionary and then sort the keys
sorted_json = json.dumps(obj.model_dump(), sort_keys=True)

print(sorted_json)
# { "a_field": "one", "b_field": 1 }

This approach provides a clean and effective way to achieve sorted keys in the JSON output, leveraging the capabilities of both pydantic and json.

Q&A

Is it possible to get pydantic v2 to dump json with sorted keys?

Yes, you can use the model_dump method to get a dictionary and then sort the keys.

How to sort keys in JSON output in pydantic v2?

Use model_dump method and sort_keys parameter of json.dumps.

Video Explanation:

The following video, titled "Python AttributeError — What is it and how do you fix it? - YouTube", provides additional insights and in-depth exploration related to the topics discussed in this post.

Play video

AttributeError: '***' object has no attribute '***' What is an AttributeError in Python? What can you do to fix it? When does it happen?