在Spring MVC + Jackson(Java)中,我可以拥有:
我的对象(Java)
public class Project {
private long id;
private String self;
private String key;
private String name;
//Getters and Setters
}
Spring MVC Controller
...
@RequestMapping(value="/doSomething", method=RequestMethod.POST)
public String doSomething(@RequestBody Project project) {
System.out.println(project.getName());
return "myPage";
}
...
然后,我可以发送一个json,如:
{"id": "exampleId", "name": "exampleName","self": "url","key": "key"}
并自动转换为我的对象。在Python上,我有我的对象类。我可以在Flask中找到一些东西:
Flask Controller
@app.route('/doSomething', methods=['POST'])
def do_something(project):
print project.name
return "myPage"
我的对象(Python)
class Project():
id=None
name=None
url=None
key=None
基本上,我想在Flask上收到我的JSON并且已经转换为我的Object。我想避免这样做:
class Project(object):
def __init__(self, id, url, name, key):
self.id = id
self.url = url
self.name = name
self.key = key
...
import json
my_json = json.loads(request.data)
user = Project(**j)
这样,我必须覆盖所有对象的init。或者这个:
project = json.loads('{"__type__": "Project", "name": "project", "key": "key"}')
print project['name']
print project['key']
不好,因为它不是我的对象,它是一个字典。
这可能吗?或者我必须选择其中一种?
答案 0 :(得分:7)
据我所知,如果您必须在Python中使用类,我认为您不能避免添加构造函数。
另一种选择是使用namedtuple。它们就像元组,但带有字段名称。无论哪种方式,您都可以使用装饰器来模拟您想要的东西
例如:
from collections import namedtuple
Project = namedtuple('Project', 'id url name key')
现在,您可以在视图处理程序中执行以下操作:
# This decorator takes the class/namedtuple to convert any JSON
# data in incoming request to.
def convert_input_to(class_):
def wrap(f):
def decorator(*args):
obj = class_(**request.get_json())
return f(obj)
return decorator
return wrap
@app.route('/doSomething', methods=['POST'])
@convert_input_to(Project)
def do_something(project):
print project.name
return "myPage"
另见flask.Request.get_json并确保'Content-Type'
设置为'application/json'