+ 2

Deserialize JSON object in python

Hi, how can I avoid checking the existence of elements inside a JSON object in python? I tried to use dataclasses, but when I deserialize an object using this dataclass it gives me an error (generated because I do not declare all the elements of the json obj in the dataclass, so rightly it does not find them). In short, I want to use a dataclass object without being forced to declare all the elements, but only some.

25th Oct 2024, 7:31 PM
Mick
Mick - avatar
12 Respostas
+ 4
Bob_Li Mick The big difference is you nolonger are using class or having to directly initialize elements as @dataclass class Product: name: str price: float category: str = None description: str = None but as <class types.Product> Product = make_dataclass("Product", [(field, type(data[field])) for field in required_fields]) https://sololearn.com/compiler-playground/cEZH2ih3LNrc/?ref=app
27th Oct 2024, 1:39 AM
BroFar
BroFar - avatar
26th Oct 2024, 1:55 AM
BroFar
BroFar - avatar
+ 5
#json.loads() will either give you a dict or a list. https://sololearn.com/compiler-playground/cXMU27Jm7Fzg/?ref=app
27th Oct 2024, 5:07 AM
Bob_Li
Bob_Li - avatar
+ 4
Mick BroFar 's 2nd code is the solution that you're looking for. The key point is to provide default values to the class properties. Then it would not complain about missing values.
27th Oct 2024, 12:20 AM
Bob_Li
Bob_Li - avatar
+ 4
You could use the object you get from json.loads and define functions to extract data from it. https://sparkbyexamples.com/JUMP_LINK__&&__python__&&__JUMP_LINK/python-json-loads-method-with-examples/ " The method(json.loads()) takes a JSON string as an input param and returns a Python object, usually a dictionary or a list, depending on the structure of the JSON string."
27th Oct 2024, 1:24 AM
Bob_Li
Bob_Li - avatar
+ 4
I think the most suitable solution is BroFar's, thanks for the solutions, explanations and patience.
27th Oct 2024, 8:58 AM
Mick
Mick - avatar
+ 3
Mick Please show us your attempt ? What it sounds like is that you are encountering a common challenge when working with JSON data and dataclasses in Python: ensuring flexibility while maintaining type safety and structure. -> The issue arises when the JSON structure is dynamic or when you only need to access a subset of its fields. In python declaring all the elements is simply common practice but there are workarounds when only needing or wanting to use some. Other languages will actually kick your programs for not declaring and using all elements. Would you like to provide more details about your specific use case, such as the structure of your JSON data and the desired behavior of your dataclass? This will help us, the community, to provide a more probable solution.
26th Oct 2024, 1:24 AM
BroFar
BroFar - avatar
+ 3
Mick okay here is how to do the following without triggering the __init__ errors https://sololearn.com/compiler-playground/c63CUeCNu6Gm/?ref=app
26th Oct 2024, 9:50 PM
BroFar
BroFar - avatar
+ 3
Mick "What if I don't want to declare them inside the class? Avoid putting them inside the dataclass?" make up your mind, please...🙄 Anyway, use what's best for the job. I agree that using dataclasses is often the better option. It provides you a better way to set up boilerplates for the data you want to extract from your json object. The code I gave were only to show what json.loads returns. Functionally extracting data from it is a lot of work. But that was only in response to your comment. (I have met people who would die defending the functional programming hill...😅. It's not worth it, imho. OOP is perfectly ok. Just don't go crazy with inheritance...)
27th Oct 2024, 11:29 AM
Bob_Li
Bob_Li - avatar
+ 1
The code I wrote is pretty much similar to "Deserializing JSON". What if I wanted to declare inside the Product class only Name and Proce, thus excluding Category and Description? Without triggering __init__() errors?
26th Oct 2024, 8:32 AM
Mick
Mick - avatar
0
What if I don't want to declare them inside the class? Avoid putting them inside the dataclass?
27th Oct 2024, 12:34 AM
Mick
Mick - avatar
0
first time on here need basics on coding
27th Oct 2024, 6:20 PM
David Keene
David Keene - avatar