java json 响应_java-在Spring B中返回JSON对象作为响应

java-在Spring B中返回JSON对象作为响应

我在Spring Boot中有一个示例RestController:

@RestController

@RequestMapping("/api")

class MyRestController

{

@GetMapping(path = "/hello")

public JSONObject sayHello()

{

return new JSONObject("{'aa':'bb'}");

}

}

我正在使用JSON库/hello

当我点击API /hello时,出现异常提示:

Servlet [dispatcherServlet]在带有路径的上下文中的Servlet.service()   []引发异常[请求处理失败; 嵌套异常为   java.lang.IllegalArgumentException:找不到返回的转换器   类型值:类org.json.JSONObject],根本原因

java.lang.IllegalArgumentException:找不到返回的转换器   类型的值:类org.json.JSONObject

有什么问题 有人可以解释到底发生了什么吗?

5个解决方案

62 votes

当您使用Spring Boot Web时,Jackson依赖关系是隐式的,我们不必显式定义。 如果使用eclipse,则可以在依赖项层次结构选项卡中的@RestController中检查Jackson依赖项。

并且正如您使用@RestController进行注释一样,无需进行显式的json转换。 只需返回一个POJO,杰克逊序列化器将负责转换为json。 与@Controller一起使用时,等效于使用@ResponseBody。 我们没有将2721665459534955555523放置在每个控制器方法上,而是默认将2721665459534955555524和@ResponseBody放置在该控制器中的所有资源上,而不是在每个控制器方法上放置2721665459534955555523。

请参阅以下链接:[https://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-ann-responsebody]

您面临的问题是因为返回的对象(JSONObject)没有某些属性的吸气剂。 您的意图不是序列化此JSONObject而是序列化POJO。 因此,只需返回POJO。

请参阅此链接:[https://stackoverflow.com/a/35822500/5039001]

如果要返回json序列化的字符串,则只需返回该字符串。 在这种情况下,Spring将使用StringHttpMessageConverter而不是JSON转换器。

prem kumar answered 2020-01-27T21:47:11Z

34 votes

您当前的方法不起作用的原因是,默认情况下使用Jackson来序列化和反序列化对象。 但是,它不知道如何序列化JSONObject。如果要创建动态JSON结构,则可以使用ObjectNode,例如:

@GetMapping

public Map sayHello() {

HashMap map = new HashMap<>();

map.put("key", "value");

map.put("foo", "bar");

map.put("aa", "bb");

return map;

}

这将导致以下JSON响应:

{ "key": "value", "foo": "bar", "aa": "bb" }

这有点受限制,因为添加子对象可能会变得更加困难。 杰克逊有自己的机制,使用ObjectNode和ArrayNode。要使用它,必须在服务/控制器中自动连线ObjectMapper。 然后,您可以使用:

@GetMapping

public ObjectNode sayHello() {

ObjectNode objectNode = mapper.createObjectNode();

objectNode.put("key", "value");

objectNode.put("foo", "bar");

objectNode.put("number", 42);

return objectNode;

}

这种方法使您可以添加子对象,数组并使用所有各种类型。

g00glen00b answered 2020-01-27T21:47:45Z

31 votes

您可以按照@vagaasen的建议将响应返回为String,也可以使用Spring提供的ResponseEntity,如下所示。 通过这种方式,您还可以返回Http status code,这在Web服务调用中更为有用。

@RestController

@RequestMapping("/api")

public class MyRestController

{

@GetMapping(path = "/hello", produces=MediaType.APPLICATION_JSON_VALUE)

public ResponseEntity sayHello()

{

//Get data from service layer into entityList.

List entities = new ArrayList();

for (Entity n : entityList) {

JSONObject entity = new JSONObject();

entity.put("aa", "bb");

entities.add(entity);

}

return new ResponseEntity(entities, HttpStatus.OK);

}

}

Sangam Belose answered 2020-01-27T21:48:06Z

8 votes

您也可以为此使用哈希表

@GetMapping

public HashMap get() {

HashMap map = new HashMap<>();

map.put("key1", "value1");

map.put("results", somePOJO);

return map;

}

maximus answered 2020-01-27T21:48:26Z

4 votes

@RequestMapping("/api/status")

public Map doSomething()

{

return Collections.singletonMap("status", myService.doSomething());

}

PS。 仅适用于1个值

Dmitry answered 2020-01-27T21:48:46Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值