Java SpringRequestBody将JSON转换为字符串

Java SpringRequestBody将JSON转换为字符串,java,spring,rest,deserialization,Java,Spring,Rest,Deserialization,我有一个RestController类,它有一个方法可以根据电影的标题搜索电影: @RequestMapping(value = "/film", method = RequestMethod.POST, consumes = "application/json", produces = "application/json") public Film getFilm(@RequestBody String filmSearch){ FilmInfo film

我有一个RestController类,它有一个方法可以根据电影的标题搜索电影:

@RequestMapping(value = "/film", method = RequestMethod.POST,
               consumes = "application/json", produces = "application/json")
public Film getFilm(@RequestBody String filmSearch){
    FilmInfo filmInfo = new FilmInfo();
    Film film = filmInfo.getFilm(filmSearch);
    return film;
}
如果我发送一个json字符串

{
 "filmSearch":"<title>"
} 
在输入查找字符串的方法之后,filmSearch正好是我从Postman发送的JSON字符串。我的应用程序没有看到JSON,也没有从我请求附加到应用程序内字符串filmSearch的filmSearch中提取值

如果我移除

consumes = "application/json" 
参与RequestMapping并发送一个标题的纯文本字符串,我得到一个Film对象作为JSON返回


我不希望在搜索词中使用纯文本,但是,如何在输入方法时正确地将JSON转换为字符串?

如果您添加请求主体不是字符串对象。接收到的服务器是字符串json而不是对象。您可以尝试以下代码:

@RequestMapping(value = "/film", method = RequestMethod.GET, produces = "application/json")
public Film getFilm(@RequestParam("search") String search){
    FilmInfo filmInfo = new FilmInfo();
    Film film = filmInfo.getFilm(search);
    return film;
}
如果您使用邮递员:

  • URL:/flim?search=minion
  • 方法:获取
  • 标题:内容类型:application/json

如果添加请求,则请求正文不是字符串对象。接收到的服务器是字符串json而不是对象。您可以尝试以下代码:

@RequestMapping(value = "/film", method = RequestMethod.GET, produces = "application/json")
public Film getFilm(@RequestParam("search") String search){
    FilmInfo filmInfo = new FilmInfo();
    Film film = filmInfo.getFilm(search);
    return film;
}
如果您使用邮递员:

  • URL:/flim?search=minion
  • 方法:获取
  • 标题:内容类型:application/json

这是因为您将整个JSON负载作为字符串传递到“getfilm()”函数中。 您希望调用的是
getfilm()
,但实际调用的是
getfilm({“filmSearch”:“})
,这是错误的。 最好的选择是,将该字符串转换为JSON,如下所示

JSONObject jsonstring = new JSONObject(filmSearch);
FilmInfo filmInfo = new FilmInfo();
Film film = filmInfo.getFilm(jsonstring.get("title"));

您还可以忽略请求映射中的“consumes=”application/json“。

这是因为您在“getfilm()”函数中以字符串形式传递整个json负载。 您希望调用的是
getfilm()
,但实际调用的是
getfilm({“filmSearch”:“})
,这是错误的。 最好的选择是,将该字符串转换为JSON,如下所示

JSONObject jsonstring = new JSONObject(filmSearch);
FilmInfo filmInfo = new FilmInfo();
Film film = filmInfo.getFilm(jsonstring.get("title"));

您还可以忽略请求映射中的“consumes=”application/json“。

为什么要使用POST HTTP方法来检索内容?我假设客户端没有在其请求中指定
application/json
。我的邮递员请求是一个原始正文请求,选择了application/json选项,而不是文本(纯文本)。您似乎希望Spring将JSON解析为一个对象,查看它有一个filmSearch属性,提取其值,并将该值传递给您的方法。为什么会这样?不会的。发送JSON,接收JSON。但是,它可以解析JSON并返回一个对象(使用JSON映射器,如Jackson)这与您发送的JSON的结构相匹配。为什么要使用POST HTTP方法来检索某些内容?我假设客户端没有在其请求中指定
application/JSON
。我的邮递员请求是一个原始正文请求,选择了application/JSON选项,而不是文本(纯文本)。您似乎希望Spring将JSON解析为一个对象,查看它有一个filmSearch属性,提取其值,并将该值传递给您的方法。为什么会这样?不会的。发送JSON,接收JSON。但是,它可以解析JSON并返回一个与您发送的JSON结构匹配的对象(使用Jackson之类的JSON映射器)。我将实施这一点。谢谢为GET请求设置内容类型头是无用的:GET请求没有内容。好吧,我搞错了它的工作原理。我将实施这一点。谢谢为GET请求设置内容类型头是无用的:GET请求没有内容。