当前位置: 首页 > 知识库问答 >
问题:

如何在Spring MVC中将JSON正文转换为POJO

郭皓
2023-03-14

我有课

class Student {
    String id;
    String name;
    //getters
    //setters
}

我有一个JSON请求

{
  "id": "1",
  "name": "asd",
}

我有一个REST API

@RequestMapping(value = "/student", method = RequestMethod.POST, produces = "application/json")
    public @ResponseBody String getstudent(HttpServletRequest request, HttpServletResponse response,
            @RequestBody Student student,
            @RequestHeader HttpHeaders requestHeaders) {

     return null;
}

当我调用此API并可视化此student对象时,这两个字段都有我提供的请求中的值。

我不明白的是:

  1. JSON值如何直接映射到学生类对象
  2. 是否涉及序列化/反序列化
  3. 建构师在学生课堂上有什么重要性吗

共有1个答案

顾俊哲
2023-03-14

1)JSON值如何直接映射到学生类对象:

您使用的Web应用程序配置了Spring MVC支持(配置@EnableWebMvc@Configuration等)。

默认情况下启用了一些HttpMessageConverters。

Spring接收到一个新请求后,使用Accept头来确定媒体类型。然后找到可以处理媒体类型的注册转换器。它将使用它转换实体并发回响应。使用JSON信息接收请求-Spring使用内容类型头来确定请求主体的媒体类型。

然后,它将搜索一个可以将客户端发送的正文转换为Java对象的HttpMessageConverter。

例如,MappingJackson2HttpMessageConverter是JSON转换器之一:

公共类MappingJackson2HttpMessageConverter扩展了AbstractJackson2HttpMessageConverter的实现,它可以使用Jackson 2. x的ObjectMapper读取和写入JSON。此转换器可用于绑定到类型化bean或非类型化HashMap实例。

默认情况下,此转换器支持具有UTF-8字符集的application/json和application/*json。这可以通过设置supportedMediaTypes属性来覆盖。

默认构造函数使用Jackson2ObjectMapperBuilder提供的默认配置。

从Spring 5.0开始与Jackson 2.9及更高版本兼容。

参数上使用的@Request estbody告诉Spring,HTTP请求应该反序列化为Java实体。客户端应用程序指定的Content-Type标头将有助于确定适当的转换器。

方法上的ResponseBody向Spring指示返回值直接序列化到HTTP响应的主体。

2)是否涉及序列化/反序列化?

直接涉及序列化和反序列化。

公共字段,具有提供的getter的字段可以序列化和反序列化。setter使非公共字段只能反序列化。还可以在ObjectMapper级别进行全局配置,以使用公共字段或getter/setter方法进行序列化。

3)建构师在学生课堂上有没有重要性?

默认情况下不涉及构造函数。正如我在上一节中提到的,getter和setter用于访问字段。

但是,可以使用JsonCreator和JsonProperty配置构造函数以参与序列化/反序列化过程:

@JsonCreator
public Student (@JsonProperty("id") String id, @JsonProperty("name") String name) {
    this.id = id;
    this.name = name;
}
 类似资料:
  • 问题内容: 我正在尝试找到一个Java lib / api,它将允许我将HTTP Request POST主体的内容转换为JSON对象。 理想情况下,我想使用Apache Sling 库(因为它们自然暴露在我的容器中)。 我找到的最接近的文件:将标头转换为JSON。 HTTP Post正文采用以下格式:所以我认为那里有些东西,但是我还没找到。 如果某些东西不存在,我可能只需要使用自定义()即可。有

  • 我有一条路由(Camel 2.17.3),它使用丰富的 DSL 调用Rest服务并将结果聚合到消息正文中。不过,我遇到了序列化问题。这是我正在尝试的。我的路线如下所示: 正如您所看到的,我想使用enrich()DSL调用一些现有服务,并将这些结果聚合起来,形成一个新的消息体,以便进一步处理。我需要将rest调用的结果从Json转换为MyResponse。我想用这个: 但我需要它已经在我的Aggre

  • 问题内容: 以下是我的json文件输入 码 输出量 因此,在这里我确实得到了答案,但是没有打印一次,而是打印了7次。如何解决此问题。 问题答案: 是一个字典,您不需要对其进行迭代。您可以使用键直接访问值。 例如:

  • 问题内容: 我想将json字符串转换为javascript中的yaml格式。我从过去两天开始尝试在Google上找到任何解决方案或库。有适用于Java的答案,但不适用于javascript。 假设我有这样的json字符串: 转换为yaml: 有一个在线转换器http://www.json2yaml.com/,但是如何在javascript中转换成它。 问题答案: YAML是JSON的超集。由于任何

  • 问题内容: 我正在App Engine上进行一些工作,我需要将从远程服务器检索到的XML文档转换为等效的JSON对象。 我用来解析由返回的XML数据。我还尝试使用将已解析的XML文档转换为JSON。我对如何将两者钩在一起完全不知所措。以下是我要修改的代码: 问题答案: Soviut对于lxml objectify的建议是好的。使用特殊子类化的simplejson,您可以将lxml对象化结果转换为j

  • 问题内容: 我对编程非常陌生,过去3/4星期一直在学习python,这是给出的作业之一。 输入项 输出量 我一直在尝试代码为: 此代码的输出如下: 谁可以帮我这个事? 问题答案: 处理完整行后转储。