[ Web Proxy ]
URL:
Viewing: https://www.tutorialspoint.com/python/json_decoder_JSONDecoder_object_hook_attribute.htm [Back]  [Original]

Python json.decoder.JSONDecoder.object_hook Attribute
Tutorials Courses Jobs Login
Selected Reading
Home Python Python json.decoder.JSONDecoder.object_hook Attribute

Python json.decoder.JSONDecoder.object_hook Attribute



The Python json.decoder.JSONDecoder.object_hook attribute is used to specify a custom function for decoding JSON objects into custom Python objects.

It is useful when you want to deserialize JSON dictionaries into instances of a specific class rather than just Python dictionaries.

Syntax

Following is the syntax of using the object_hook attribute

json.decoder.JSONDecoder(object_hook=function)

Parameter

It is a user-defined function that transforms parsed JSON objects (dictionaries) into custom Python objects.

Return Value

The object_hook attribute modifies the default dictionary decoding behavior and returns an instance of the specified custom class.

Example: Basic Usage of object_hook

In this example, we use the object_hook attribute to convert a JSON object into a Python class instance

import json

# Define a custom class
class Person:
   def __init__(self, name, age, city):
      self.name = name
      self.age = age
      self.city = city

   def __repr__(self):
      return f"Person(name={self.name}, age={self.age}, city={self.city})"

# Define a function to convert JSON object to Person instance
def person_decoder(obj):
   return Person(obj['name'], obj['age'], obj['city'])

# JSON string
json_string = '{"name": "Alice", "age": 30, "city": "New York"}'

# Create JSONDecoder instance with object_hook
decoder = json.decoder.JSONDecoder(object_hook=person_decoder)

# Decode JSON into a custom object
parsed_data = decoder.decode(json_string)

print("Decoded Custom Object:", parsed_data)

Following is the output obtained

Decoded Custom Object: Person(name=Alice, age=30, city=New York)

Example: Handling Nested JSON Structures

The object_hook attribute can be extended to handle nested JSON structures

import json

# Define a custom class
class Employee:
   def __init__(self, name, department):
      self.name = name
      self.department = department

   def __repr__(self):
      return f"Employee(name={self.name}, department={self.department})"

# Custom decoder function
def employee_decoder(obj):
   if "name" in obj and "department" in obj:
      return Employee(obj['name'], obj['department'])
   return obj  # Return unchanged for other objects

# JSON string containing nested data
json_string = '{"company": "TechCorp", "employee": {"name": "John", "department": "IT"}}'

# Create JSONDecoder instance with object_hook
decoder = json.decoder.JSONDecoder(object_hook=employee_decoder)

# Decode JSON into a custom object
parsed_data = decoder.decode(json_string)

print("Decoded Nested Object:", parsed_data)

Following is the output of the above code

Decoded Nested Object: {'company': 'TechCorp', 'employee': Employee(name=John, department=IT)}

Example: Ignoring Certain Keys in JSON

The object_hook attribute can be used to filter out unnecessary keys from JSON

import json

# Custom decoder function to remove unwanted keys
def filter_keys(obj):
   obj.pop("ignore_this", None)  # Remove the key if it exists
   return obj

# JSON string with unnecessary data
json_string = '{"name": "Alice", "age": 28, "ignore_this": "remove me"}'

# Create JSONDecoder instance with object_hook
decoder = json.decoder.JSONDecoder(object_hook=filter_keys)

# Decode JSON
parsed_data = decoder.decode(json_string)

print("Filtered JSON:", parsed_data)

We get the output as shown below

Filtered JSON: {'name': 'Alice', 'age': 28}

Example: Changing Key Names while Decoding

The object_hook attribute can be used to rename keys dynamically

import json

# Custom function to rename JSON keys
def rename_keys(obj):
   new_obj = {}
   for key, value in obj.items():
      new_obj[f"custom_{key}"] = value  # Prefix key names with 'custom_'
   return new_obj

# JSON string
json_string = '{"name": "Charlie", "age": 35, "city": "Boston"}'

# Create JSONDecoder instance with object_hook
decoder = json.decoder.JSONDecoder(object_hook=rename_keys)

# Decode JSON
parsed_data = decoder.decode(json_string)

print("Renamed Keys JSON:", parsed_data)

The result produced is as follows

Renamed Keys JSON: {'custom_name': 'Charlie', 'custom_age': 35, 'custom_city': 'Boston'}
python_json.htm
Tutorix - AI Tutor [Tutorix - AI Tutor]
Print Page
Advertisements

Web Proxy Viewer  |  New URL  |  Original Page