Java 根据Flask请求自动将JSON转换为对象

Java 根据Flask请求自动将JSON转换为对象,java,python,json,spring-mvc,flask,Java,Python,Json,Spring Mvc,Flask,在Spring MVC+Jackson(Java)中,我可以做到: 我的对象(Java) Spring MVC控制器 ... @RequestMapping(value="/doSomething", method=RequestMethod.POST) public String doSomething(@RequestBody Project project) { System.out.println(project.getName()); return "myPage";

在Spring MVC+Jackson(Java)中,我可以做到:

我的对象(Java)

Spring MVC控制器

...
@RequestMapping(value="/doSomething", method=RequestMethod.POST)
public String doSomething(@RequestBody Project project) {
    System.out.println(project.getName());
    return "myPage";
}
...
@app.route('/doSomething', methods=['POST'])
def do_something(project):
    print project.name
    return "myPage"
然后,我可以发送类似以下内容的json:

{"id": "exampleId", "name": "exampleName","self": "url","key": "key"}
它会自动转换成我的对象。在Python上,我有我的对象类。烧瓶里有些东西我可以称之为:

烧瓶控制器

...
@RequestMapping(value="/doSomething", method=RequestMethod.POST)
public String doSomething(@RequestBody Project project) {
    System.out.println(project.getName());
    return "myPage";
}
...
@app.route('/doSomething', methods=['POST'])
def do_something(project):
    print project.name
    return "myPage"
我的对象(Python)


本质上,我希望在Flask上接收JSON,并且已经转换为我的对象。我想避免这样做:

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']
也不好,因为这不是我的目标,这是一个命令


这可能吗?或者我必须选择其中一个?

据我所知,如果必须在Python中使用类,我认为您无法避免添加构造函数

另一个选择是使用。它们类似于元组,但具有字段名。无论哪种方式,你都可以用装饰器来模拟你想要的东西

例:

现在,您可以在视图处理程序中执行以下操作:

# 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"

另请参阅并确保
'Content-Type'
设置为
'application/json'

谢谢。这很好用。我只是需要调整namedtuple类以在以后使用方法,所以它看起来像:
classproject(namedtuple('Project','idurl-name-key')):def\uu-new(cls,id=None,name=None,url=None,key=None):返回super(Project,cls)。\uu-new(cls,id,name,url,key)
正确的类:
classproject(namedtuple('Project','id name url key'):def uu new uu(cls,id=None,name=None,url=None,key=None):返回super(Project,cls)。u new uu(cls,id,name,url,key)
我知道Django Rest框架会自动完成这类工作(拥有模型后,无需自己构建所有对象).真的没有办法在烧瓶里做同样的事吗?
# 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"