有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在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控制器

...
@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上,我有我的对象类。烧瓶里有些东西我可以称之为:

烧瓶控制器

@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,并且已经转换为我的对象。我想避免这样做:

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']

也不好,因为这不是我的目标,这是一个命令

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


共 (1) 个答案

  1. # 1 楼答案

    据我所知,如果必须在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'