Etienne Desgagné
Etienne Desgagné

Reputation: 3252

How to serialize to JSON list of tuples containing Decimal in Django?

I have a Django model containing DecimalField. The resulting json should contain only data (no keys) so I'm using values_list() to convert queryset to list of Tuples:

    MyModel.objects.filter(...).values_list('my_date_field','my_decimal_field').order_by('my_date_field')

Then, I need to serialize it to json... but json.dumps does not seems to be able to process the Decimal field... A lot of SO answers about that suggest to make your own encoder to use with json.dumps but those custom encoders are not recursive and seems not to work with a list of Tuple...

What I need is returning json with this format:

[[1162512000000,78.29],
[1162771200000,79.71],
[1162857600000,80.51],
[1162944000000,82.45],
[1163030400000,83.34],
[1163116800000,83.12],
[1163376000000,84.35]]

It seems to me that this should be a simple task but can't find a simple way to do it without having to parse and process everything manually...

Any suggestions?

Thanks a lot

Etienne

Upvotes: 2

Views: 880

Answers (1)

HankMoody
HankMoody

Reputation: 3174

This should work:

import json
from decimal import Decimal as D

class DecimalJSONEncoder(json.JSONEncoder):
    def default(self, o):
        if type(o) == D:
            # Here You can decide if You want decimal to be converted
            # to string or float.
            return float(o)
        return super(DecimalJSONEncoder, self).default(o)

data = [[1162512000000, D(78.29)], 
     [1162771200000, D(79.71)],
     [1162857600000, D(80.51)],
     [1162944000000, D(82.45)],
     [1163030400000, D(83.34)],
     [1163116800000, D(83.12)],
     [1163376000000, D(84.35)]]

encoder = DecimalJSONEncoder()
encoder.encode(data)

# Result:
# '[[1162512000000, 78.29], [1162771200000, 79.71], [1162857600000, 80.51], ...'

Upvotes: 1

Related Questions