[Python] JSON Serialize a Python Class

Valerio Maggio valerio.maggio a gmail.com
Sab 11 Gen 2014 19:16:47 CET


On 11 Jan 2014, at 18:46, Marco Olimpi <badstorm a gmail.com> wrote:

> Hi, 

Ciao.
Non so perché tu abbia postato in Inglese (forse mero copia incolla da un post in altra lista), ma leggendo l'inglese deduco che possa risponderti tranquillamente in Italiano :P

> class User():
>   def __init__(self, _name, _lastname):
>        self.Name = _name
>        self.LastName = _lastname
> 
> class News():
>   def __init__(self, _news,_user):
>        self.News = _news
>        self.User = _user
> 

Voglio solo farti notare che questo modo di definire le classi è un cattivo idioma (sia in Python 2 che Python 3).
Per inciso:

(Python 2)
class News(object):
    […]

(Python 3)
class News:
    […]

L'argomento è stato ampiamente trattato altrove e un buon manuale può risolverti qualsiasi dubbio.

> 
> than i create my class in my code:
> 
> ...
> myUser = User("Mario","Rossi")
> myNews = News("My last news", myUser)
> 
> JSONstring = dumps(myNews)
> ...
> 

Tornando a noi: deduco che tu stia utilizzando `simplejson.dumps`

> but in the last line of code i get the error that the News class is not JSON serializable.
> 

Anche in questo caso, la questione è arci-nota. Basterebbe google per questo!
Ad ogni modo: http://simplejson.readthedocs.org/en/latest/#encoders-and-decoders

La questione è che devi definire un `custom_encoder` per codificare un oggetto custom.
Banalmente questo:

def custom_encoder(obj):
    if isinstance(obj, News):
        return obj.to_json()
    return simplejson.encoder(obj)

JSONstring = dumps(range(2), default=custom_encoder)

dovrebbe risolverti il problema.
Quello che ti resta da fare è implementare il metodo `to_json` nella classe `News` che faccia al caso tuo, ricordando quali siano le conversioni di tipo Python2JSON di default 
(trovi una tabella a riguardo nella documentazione che ti ho segnalato).

Ciao
--
valerio


-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140111/a860a8c3/attachment.html>


Maggiori informazioni sulla lista Python