¿Cómo codificar una lista de objetos json en un matraz?

He escrito mi jsonencoder personalizado de la siguiente manera;

from flask.json import JSONEncoder from models.AtgSiteToPoll import * class CustomJSONEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, AtgSiteToPoll): return obj.__dict__ return JSONEncoder.default(self, obj) 

En mi aplicación principal configuro mi codificador de la siguiente manera; Y tratar de devolver la lista de objetos de la base de datos. para un solo objeto, llamo al codificador como jsonEncoder.default(a) Pero, ¿cómo puedo usar el codificador para la lista de objetos (es decir, formatted_atgsites )?

 from flask import Flask, jsonify, request import httplib app = Flask(__name__) app.json_encoder = CustomJSONEncoder def BuildATGSite(siteid): jsonEncoder = CustomJSONEncoder() atgsites=[] if siteid is None : atgsites = atgsitetopoll.query.all() else : atgsites = atgsitetopoll.query.filter_by(siteid=siteid).first() formatted_atgsites=[] a = AtgSiteToPoll() if atgsites !=[] : for atgs in atgsites: formatted_atgsites.append({ a.SiteId = atgs.siteid a.IPAddress = atgs.ipaddress a.Port = atgs.port a.Category = atgs.category a.UserId = atgs.userid a.Password = atgs.password a.ReceiveTimeoutInMilliSeconds = atgs.receivetimeoutinmilliseconds }) else: a.SiteId = '12345' a.IPAddress = '10.10.10.10' a.Port = 10001 a.Category = 1 a.UserId = 'testuser' a.Password = 'testpassword' a.ReceiveTimeoutInMilliSeconds = '60' return jsonEncoder.default(a) 

iirc CustomJSONEncoder codifica recusivamente, sin embargo, dado que está llamando a JSONEncoder.default(self, obj) , no se lo llama recursivamente. Tal vez intente

 class CustomJSONEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, AtgSiteToPoll): return obj.__dict__ return obj 

Aquí un ejemplo (sin matraz).

 import json # example of a custom class class AtgSiteToPoll(object): def __init__(self, site_id, ip): self.site_id = site_id self.ip = ip # other properties ... def to_json(self): return { 'SiteId': self.site_id, 'IPAddress': self.ip, # other properties/structures etc... } class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, AtgSiteToPoll): # get our dict return obj.to_json() # call default encoder(in this case we will process list) return json.JSONEncoder.default(self, obj) example_list = [ AtgSiteToPoll('1', '10.10.10.10'), AtgSiteToPoll('2', '10.10.10.11'), # other instances... ] print(json.dumps(example_list, cls=CustomEncoder)) # output: # [{"IPAddress": "10.10.10.10", "SiteId": "1"}, {"IPAddress": "10.10.10.11", "SiteId": "2"}] 

Espero que esto ayude. No te recomiendo que uses obj.__dict__ (no funcionará en todos los casos).