如何以 JSON 格式发送 Integer 值并在 REST Controller 中接收?

Posted

技术标签:

【中文标题】如何以 JSON 格式发送 Integer 值并在 REST Controller 中接收?【英文标题】:How to send Integer value in the form of JSON format and recieve in REST Controller? 【发布时间】:2019-04-24 00:05:02 【问题描述】:

我有一个 REST 控制器,我在其中编写了这段代码

@PostMapping(value = "/otp")
public void otp(@RequestBody Integer mobile) 

    System.out.println(" Mobile = "+mobile);

我使用以下输入从 Postman 调用此方法

URL : localhost:8080/otp

Body


    "mobile":123456

但我得到以下异常

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize instance of java.lang.Integer out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.Integer out of START_OBJECT token

如果我像这样将字符串作为参数

@PostMapping(value = "/otp")
public void otp(@RequestBody String mobile) 

    System.out.println(" Mobile = "+mobile);

并将输入作为


    "mobile":123456

现在在控制台打印如下

 Mobile = 
    "mobile":"123456"

但我只想要这个值123456。如何达到我的要求?

注意:我不想创建任何额外的 POJO 类,甚至不想使用查询/路径参数发送数据。

【问题讨论】:

我会说:而不是 "mobile" : 123456 只需发送 123456 作为 HTTP 正文。或者,使用 Integer 字段创建一个类 Mobile,并将其用作方法的参数。 【参考方案1】:

只需以 JSON 格式发送号码。 12345 使用 @RequestBody 接收 int 号。 它会起作用的。 我使用邮递员以 RAW JSON 格式发送。

顺便说一句,我是学习 Spring Boot 的初学者。

【讨论】:

【参考方案2】:

json和@RequestBody的转换过程是自动的,需要你提供一个包含适当字段的类。如果你坚持通过请求体发送数据,你可以使用String接收json数据作为String。例如:

public void test(@RequestBody String request)
        log.info(request);
    

这样你收到的请求正文是一个字符串。你需要一些其他工具来帮助你转换它。像org.json,你可以从这里得到更多信息HttpServletRequest get JSON POST data

但最简单的方法是创建一个新类来接收数据或将@RequestBody 更改为@RequestParam 或@Pathvariable。

如果您仍然想使用 json 作为请求正文,也许您可​​以创建一个通用类 A,其中包含许多字段,如姓名、电话号码、电子邮件......然后在您发送仅包含移动设备的请求后,您只需要A.getMobile()。这样,即使你得到100个请求,你仍然需要一个POJO(但不推荐)

【讨论】:

考虑到这个问题不是很合理,这是一个合理的答案。【参考方案3】:

如果你有 org.json.JSONObject

 @PostMapping(value = "/otp")
 public void otp(@RequestBody String mobile) 
   JSONObject obj = new JSONObejct(mobile);
   System.out.print(obj.getInt("mobile"));

【讨论】:

【参考方案4】:

如果你想像这样发送你的身体:


    "mobile":123456

您将创建另一个对象来接收该值。

但如果你只想接受整数值而不接受任何其他对象,你不会将json对象放入请求正文中,而只会放入整数本身。

Body:

12345

【讨论】:

【参考方案5】:

像下面这样创建一个 pojo 类。

public class Mobile
   private Integer mobile;
  //getter and setter

然后

public void otp(@RequestBody Mobile mobile)

打印值使用

mobile.getMobile();

【讨论】:

我不想发送查询参数中的数据。我只想通过 JSON 正文发送。 虽然这样的类是一种方法,但 OP 想要一个 integer,而不是 string 感谢指正。在问题的一个地方他也提到了字符串。 我不想为一个属性/值创建一个额外的 POJO 类。如果我们有 100 个类的需求,那么我们不需要创建 100 个 POJO 类。甚至我也不想将数据作为查询或路径参数发送。除了这些,如果有任何解决方案,请告诉我。【参考方案6】:

您可以使用类作为请求正文:

class Request 
    public Integer mobile;

并像这样指定参数:

public void otp(@RequestBody Request mobile) 
...

【讨论】:

我不想为一个属性/值创建一个额外的类。如果我们有 100 个类的需求,那么我们不需要创建 100 个 POJO 类。 @Altaf 在现实世界的情况下,一个字段有 100 个 POJO 类有点不寻常。请参阅 AokoQin 的回答,该回答建议有一个共同的课程,或者更清楚地解释您的情况。

以上是关于如何以 JSON 格式发送 Integer 值并在 REST Controller 中接收?的主要内容,如果未能解决你的问题,请参考以下文章

PHP 如何从 AJAX 调用中发布多个数组/json 值并在同一个 SQL 查询中运行它们?

Grails 以 JSON 格式发送请求并在控制器中解析它

如何使用 JS 获取不同的值并在 JSON 上求和

如何从 javascript 变量发送表单值并在 php 中作为整数接收? [复制]

如何在 asp.net 代码中获取引导文本框值并在存储过程中作为参数发送?

如何在 json 有效负载中格式化 Map<Entity,integer>