当前位置: 首页 > 面试题库 >

在SpringMVC中使用@ResponseBody返回JsonObject

郑曜灿
2023-03-14
问题内容

我在SpringMVC项目中将新的Java API(JSR 353)用于JSON。

这个想法是生成一些Json数据并将其返回给客户端。我所拥有的控制器看起来像这样:

@RequestMapping("/test")
@ResponseBody
public JsonObject test() {
        JsonObject result = Json.createObjectBuilder()
                .add("name", "Dade")
                .add("age", 23)
                .add("married", false)
                .build();
        return result;
    }

当我访问它时,我没有得到JSON的预期表示,而是得到了这些:

{"name":{"chars":"Dade","string":"Dade","valueType":"STRING"},"age":{"valueType":"NUMBER","integral":true},"married":{"valueType":"FALSE"}}

为什么是这样?到底是怎么回事?以及如何使其正确返回预期的JSON?


问题答案:

当您意识到HandlerMethodReturnValueHandler新的JSR 353 API
没有特殊要求时,答案很简单。相反,在这种情况下,RequestResponseBodyMethodProcessor(for
@ResponseBody)使用MappingJackson2HttpMessageConverter来序列化处理程序方法的返回值。

在内部,MappingJackson2HttpMessageConverter使用ObjectMapper。默认情况下,ObjectMapper使用类的getter将对象序列化为JSON。

假设你正在使用Glassfish的该JSR
353的提供者实现,这些类是org.glassfish.json.JsonObjectBuilderImpl$JsonObjectImplorg.glassfish.json.JsonStringImpl
org.glassfish.json.JsonNumberImpl,和javax.json.JsonValue$3(该值的匿名类FALSE)。

因为JsonObjectImpl(您的结果(即根,对象))是Map(特殊类型),ObjectMapper所以将地图的条目序列化为JSON键值对元素,其中Map键是JSON键,而Map值是JSON值。对于关键的,它工作正常,如序列化nameagemarried。对于值,它使用我上面提到的类及其各自的getter。例如,org.glassfish.json.JsonStringImpl实现为

final class JsonStringImpl implements JsonString {

    private final String value;

    public JsonStringImpl(String value) {
        this.value = value;
    }

    @Override
    public String getString() {
        return value;
    }

    @Override
    public CharSequence getChars() {
        return value;
    }

    @Override
    public ValueType getValueType() {
        return ValueType.STRING;
    }
    ...
}

ObjectMapper因此,使用Java Bean getter来序列化JsonStringImpl对象(即Map Entry的值),如下所示:

{"chars":"Dade","string":"Dade","valueType":"STRING"}

其他字段也一样。

如果要正确编写JSON,只需返回String

@RequestMapping("/test", produces="application/json")
@ResponseBody
public String test() {
        JsonObject result = Json.createObjectBuilder()
                .add("name", "Dade")
                .add("age", 23)
                .add("married", false)
                .build();
        return result.toString();
}

或自己制作HandlerMethodReturnValueHandler,稍微复杂一点,但更有意义。



 类似资料:
  • 问题内容: 在控制器中,我创建json数组。如果我还可以的话: 但我需要返回JSON数组和HTTP状态代码: Eclipse在XXX行中看到错误: 如何返回json + http回复?我的工作代码用于返回一个json对象+ http状态代码: 问题答案: 现在我回来了。我不知道更好的解决方案,但是可以。

  • 问题内容: Spring 4.2.0,Hibernate 4.1.4, 这是我的功能: 中的Jackson JSON映射器依赖项: 在我的中获取列表,但返回时显示以下错误: 链接到我正在关注的示例。 问题答案: 将以下依赖项添加到pom.xml中:

  • 我将对象作为JSON字符串存储在数据库中。我想制作一个公开这些字符串的REST服务。然而,当我编写方法时,我返回的字符串中的引号被转义了。例如,我包含了一个返回字符串的方法,

  • 使用接受JSON请求体的Spring MVC开发REST Web服务。并进一步处理接收到的消息。我使用以下:Eclipse,Tomcat,Spring 3.0.1,Jackson lib,Curl来测试Web服务 返回 我的控制器类 我的人类

  • 我正在使用Spring形式。我只需要得到Staemap作为响应,但我得到的是整个jsp页面作为响应。

  • 我正在使用@ResponseBody返回spring MVC中的Json对象。它在4.0.7和3.2.11版上正常工作,但当我尝试使用最新的spring 4.1.1版(截至10/16版)时,它返回HTTP状态406,没有任何其他配置更改。这是一个bug还是4.1.1需要不同的配置? 最新的jackson jar已经在类路径中 spring文件的例子很好用 当返回类型为字符串时。当返回类型是POJO