2017-02-21 24 views
0

Итак, я изучаю, как создать флеш-webservice, и я начал с такого кода.Pythonic Way для сериализации результатов запроса с нестандартными типами для JSON

#... 
class Objects(Resource) : 
    def get(self) : 
     conn = engine.connect() 
     query = conn.execute("SELECT * FROM objects") 
     return {'objects' : [dict(zip(tuple(query.keys()), i)) for i in query.cursor]} 

api.add_resource(objects, '/objects')` 
#... 

, который был хорошо, пока я не наткнулся на стол с полем в базе данных, представленных в виде десятичной, который не было сериализацией с приведенным выше примером.

Так что я пошарил и придумал следующее.

class object(Resource) : 
    def get(self): 
     conn = engine.connect() 
     query = conn.execute("SELECT * FROM objects") 
     objects = [] 
     for row in query: 
      object = {} 
      for key in query.keys() : 
       if(type(row[key]) is decimal.Decimal) : 
        object[key] = float(row[key]) 
       else : 
        object[key] = row[key] 
      objects.append(object)  

     return {'objects': objects} 

Этот код работает нормально, но моя внутренность говорит мне, что должен быть лучший способ его написать. Будучи новичком в python, однако я не уверен, как продолжить ...

Как можно было бы рассмотреть вышеупомянутый случай в более питоническом ключе, используя возможности pythons и библиотеки классов?

+0

использование dict понимание. Но больше всего используйте http://codereview.stackexchange.com вместо этого сайта. –

+0

Мне не было известно о сайте codereview.stackexchange.com Я буду использовать его в будущем для этого типа вопросов. – earnshae

ответ

0

https://jsonpickle.github.io/ - это достойная библиотека для сериализации объектов Python в строки JSON.

import jsonpickle 
json_str = jsonpickle.encode(obj) 

Существует также способ его декодирования позже.

Если вы когда-либо сериализовали экземпляры модели SQLAlchemy (по сравнению с наборами результатов SQL), убедитесь, что вы либо отсоединяете, либо делаете их переходными, но чтобы избежать проблем.