user9260670
user9260670

Reputation:

convert list of class objects into json in python or django

my_objects = []
my_objects.append(Needed("bye",9))
my_objects.append(Needed("tata",8))
my_objects.append(Needed("hi",10))

i have list of object(example 5 objects in list) like this

class Needed:

   def __init__(self, name, number):
      self.name = name
      self.number = number

and i need to convert this into json order by count like below

{
   "results":[
               { "name":"hi",
                 "number":"10"
                },
                { "name":"bye",
                 "number":"9"
                },
                { "name":"tata",
                 "number":"8"
                },
                ...........
                ...........
              ]
}

so how to achieve this in django

Upvotes: 2

Views: 11225

Answers (2)

bruno desthuilliers
bruno desthuilliers

Reputation: 77902

First you need to make your objects json-serializable. You could provide a default encoder function or write your own JSONEncoder as mentionned in the FineManual, but for a simple one-off case like your example building dicts from your objects is probably the simplest solution:

class Needed(object):

   def __init__(self, name, number):
      self.name = name
      self.number = number

  def to_dict(self):
      return {"name": self.name, "number": self.number}

Then build a list of dicts from your objects:

results = [obj.to_dict() for obj in my_objects]

sort it based on number:

results.sort(key=lambda obj: obj["number"])

and serialize the whole thing:

jsdata = json.dumps({"results": results})

This is pretty ordinary Python stuff - building dictionaries out of objects, making a list of them and sorting the list.

Upvotes: 6

J. Snow
J. Snow

Reputation: 306

Beside the fact that this is not django related, here is some Python code that can help you:

from operator import attrgetter

# sort objects by attribute number in reverse order
result = {'results': [obj.__dict__ for obj in sorted(my_objects, key=attrgetter('number'), reverse=True)]}

# `indent=4` returns a json string "prettyfied"
print(json.dumps(result, indent=4))

Which prints:

{
    "results": [
        {
            "name": "hi",
            "number": 10
        },
        {
            "name": "bye",
            "number": 9
        },
        {
            "name": "tata",
            "number": 8
        }
        ...
    ]
}

Hope it helps.

Upvotes: 1

Related Questions