DEV Community

Cover image for JSON to python object
Andrés Baamonde Lozano
Andrés Baamonde Lozano

Posted on

3 1

JSON to python object

This is a very fast how-to encode and decode python objects to json.

  • For decoding we will use the parameter object_hook. With it, we can pass a function to the json.loads function.
  • For encoding we will use a Custom JSON encoder.

Mapping incoming object with standard library

import json
my_json_str = '{"name":"John", "age":31, "city":"New York"}'
my_dict_json = json.loads(my_json_str)
print(my_json_str)
# output: {"name":"John", "age":31, "city":"New York"}
Enter fullscreen mode Exit fullscreen mode

Now, with a dictionary we have different approaches for making the object mapping

Mapping approach with dict and constructor´s parameters

class MyObject(object):
    def __init__(self, age:int, city:str, name:str):
        self.name = name
        self.age = age
        self.city = city

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

my_obj = json.loads(my_json_str, object_hook=lambda data: MyObject(**data))

print(my_obj)

# output: John 31 New York
Enter fullscreen mode Exit fullscreen mode

Decode class with a Custom encoder

class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        if issubclass(type(obj), MyObject):
            return json.dumps(obj.__dict__, default=lambda _: None)
        return json.JSONEncoder.default(self, obj)     

obj_str = json.dumps(my_obj, default=CustomJSONEncoder().default)
print(obj_str)
#output: "{\"name\": \"John\", \"age\": 31, \"city\": \"New York\"}"
Enter fullscreen mode Exit fullscreen mode

Mapping approach with NamedTuple

from typing import NamedTuple

class MyObjectTuple(NamedTuple):
    name:str
    city:str
    age:int

my_obj = json.loads(my_json_str, object_hook=lambda data: MyObjectTuple(**data))

print(my_obj)
# output: MyObjectTuple(name='John', city='New York', age=31)
print((my_obj)._asdict())
# output: {'name': 'John', 'city': 'New York', 'age': 31}
Enter fullscreen mode Exit fullscreen mode

Decode class without custom encoder

obj_str = json.dumps(my_obj._asdict())
print(obj_str)
# output: {"name": "John", "city": "New York", "age": 31}
Enter fullscreen mode Exit fullscreen mode

Do you any other method to object decode/encode? Do you think that it can be done better?. Leave your thoughts below, feedback is always welcomed :)

Image of Datadog

Master Mobile Monitoring for iOS Apps

Monitor your app’s health with real-time insights into crash-free rates, start times, and more. Optimize performance and prevent user churn by addressing critical issues like app hangs, and ANRs. Learn how to keep your iOS app running smoothly across all devices by downloading this eBook.

Get The eBook

Top comments (2)

Collapse
 
gravesli profile image
gravesli

I think you are great! i just want to discuss tech with Python developer.
I built a display machine state using Python3 with Flask!
Flask State Github:github.com/yoobool/flask-state
Should i can get some improvement suggestions from you? Thanks~

Collapse
 
gravesli profile image
gravesli

That's great. Would you give me a star on GitHub Flask State?
because my project isn't active. ^.^

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more