Java 如何以JSON格式发送整数值并在REST控制器中接收?
我有一个REST控制器,我在其中编写了这段代码Java 如何以JSON格式发送整数值并在REST控制器中接收?,java,json,spring,spring-boot,spring-restcontroller,Java,Json,Spring,Spring Boot,Spring Restcontroller,我有一个REST控制器,我在其中编写了这段代码 @PostMapping(value = "/otp") public void otp(@RequestBody Integer mobile) { System.out.println(" Mobile = "+mobile); } 我通过以下输入从Postman调用这个方法 URL:localhost:8080/otp 正文: { "mobile":123456 } 但我得到了以下例外 org.springframewo
@PostMapping(value = "/otp")
public void otp(@RequestBody Integer mobile) {
System.out.println(" Mobile = "+mobile);
}
我通过以下输入从Postman调用这个方法
URL:localhost:8080/otp
正文
:
{
"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类,甚至不想使用query/path参数发送数据
创建如下所示的pojo类
public class Mobile{
private Integer mobile;
//getter and setter
}
然后
public void otp(@RequestBody Mobile mobile)
打印值使用
mobile.getMobile();
您可以使用类作为请求主体:
class Request {
public Integer mobile;
}
并指定如下参数:
public void otp(@RequestBody Request mobile) {
...
如果您有org.json.JSONObject
@PostMapping(value = "/otp")
public void otp(@RequestBody String mobile) {
JSONObject obj = new JSONObejct(mobile);
System.out.print(obj.getInt("mobile"));
}
如果您想发送您的身体,如:
{
"mobile":123456
}
您将创建另一个对象以接收该值
但是,如果您只想接受整数值而不接受任何其他对象,则不会将json对象放在请求体中,而只将整数本身放在请求体中
正文:
12345
使用json和@RequestBody的转换过程是自动进行的,需要您提供一个包含正确字段的类。如果您坚持按请求正文发送数据,您可以使用字符串作为字符串接收json数据。例如:
public void test(@RequestBody String request){
log.info(request);
}
通过这种方式,您收到的请求正文是一个字符串。您需要一些其他工具来帮助您转换它。例如org.json,您可以从这里获得更多信息
但最简单的方法是创建一个新类来接收数据,或者将@RequestBody更改为@RequestParam或@Pathvariable
如果您仍然想使用json作为请求主体,也许您可以创建一个公共类a,其中包含许多字段,如姓名、电话号码、电子邮件……然后在您发送一个只包含mobile的请求后,您只需要a.getMobile()。这样,即使您收到100个请求,您仍然需要一个POJO(但不推荐)只需发送JSON格式的数字即可。 12345 使用@RequestBody接收整数。 它会起作用的。 我使用postman以原始JSON发送它
顺便说一句,我是学习Spring Boot的初学者。我不想发送查询参数中的数据。我只想通过JSON正文发送。虽然这样的类是一种方法,但OP希望有一个整数,而不是字符串!谢谢你的更正。在问题中,有一个地方他也提到了字符串。我不想为一个属性/值创建额外的POJO类。如果我们需要100个类,那么我们需要创建100个POJO类。甚至我也不想将数据作为查询或路径参数发送。除此之外,如果有任何解决方案,请告诉我。我会说:与其将
{“mobile”:123456}
作为HTTP主体发送123456
。或者创建一个带有Integer
字段的类Mobile
,并将其用作方法的参数。我不想为一个属性/值创建额外的类。如果我们需要100个类,那么我们就不需要创建100个POJO类。@Altaf在现实世界中,一个字段有100个POJO类有些不寻常。请看奥科钦的答案,其中建议开设一门普通课程,或者更清楚地解释你的情况。考虑到这个问题并不十分合理,这是一个合理的答案。