springMVC——JSON格式字符串输出示例代码简陋到优化及其乱码解决

本文介绍了如何在SpringMVC中处理JSON格式字符串的输出,从基础实现到出现乱码问题的解决,以及代码的逐步优化。通过设置@RequestMaping的produces属性解决乱码,然后探讨如何通过Spring配置统一处理字符编码。最后提出使用@RestController注解简化控制器中返回JSON的处理,适合前后端分离的开发模式。

一个JSON格式字符串输出案例实现的基础:
创建一个实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//需要导入lombok
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private String sex;
}

Cotronller 配备其相应注解实现

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import pojo.User;

@Controller
public class controller {
    @RequestMapping("/json1")
    @ResponseBody//主要作用是将解析依赖所解析的字符串转换为json格式,注解的使用十分便利
    public String json1() throws JsonProcessingException {
        //既然导入了jackson json解析依赖 创建一个对象映射器 用来实现解析目的
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User("鱿鱼片", 3, "男");
        //将我们的对象解析成为json格式,为什么使用String来定义一个字符串对象 因为json实质为一个字符串
        String str = mapper.writeValueAsString(user);
        //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便(注意)
        return str;
    }
}

maven依赖导入

   <dependency>
            <groupId>org.projectlombok</groupId><!--获取对象 注解依赖-->
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>

  <!--JSON解析工具依赖-->

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2.2</version>
        </dependency>

运行之后出现乱码:
在这里插入图片描述解决途径:
发现出现了乱码问题,我们需要设置一下他的编码格式为utf-8,以及它返回的类型;

通过@RequestMaping的produces属性来实现(不同于之前所使用的方式 查看@RequestMapping的源码可知有很多属性),修改下代码:

//produces:指定响应体返回类型和编码
@RequestMapping(value = "/json1",produces = "application/json;charset=utf-8")

代码优化 逐步偏向项目开发:
以上的解决方法是 在@RequestMapping中配置字符编码方式,但是一个controller里不止一个请求,可以通过spring配置统一解决.
添加一段消息StringHttpMessageConverter转换配置!

 <mvc:annotation-driven>
            <mvc:message-converters register-defaults="true">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>
                </bean>
                <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                    <property name="objectMapper">
                        <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                            <property name="failOnEmptyBeans" value="false"/>
                        </bean>
                    </property>
                </bean>
            </mvc:message-converters>
    </mvc:annotation-driven>

在上文,需要返回json字符串利用的是注解@ResponseBody
这也涉及到每一个请求也要配上注解@ResponseBody 略显麻烦,在类上直接使用 @RestController ,这样子,里面所有的方法都只会返回 json 字符串了,在前后端分离开发中,一般都使用 @RestController很便捷。当然每一个controller类是有不同的作用的这个,如果以下全是需要返回json字符串:

@RestController//改用RestController 以下就不用 @ResponseBody//主要作用是将解析依赖所解析的字符串转换为json格式,注解的使用十分便利
public class controller {
    @RequestMapping(value="/json1")//解决浏览器输出乱码问题-spring配置解决

    public String json1() throws JsonProcessingException {
        //既然导入了jackson json解析依赖 创建一个对象映射器 用来实现解析目的
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User("鱿鱼片", 3, "男");
        //将我们的对象解析成为json格式,为什么使用String来定义一个字符串对象 因为json实质为一个字符串
        String str = mapper.writeValueAsString(user);
        //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便(注意)
        return str;
    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值