2020-08-22 SpringMVC中Json使用、后端返回给前端的JSON对象乱码问题、前台对Json数据格式的操作、Jackson以及FastJson使用

本文介绍了SpringMVC中处理Json数据的相关问题,包括Json的使用、后端返回给前端的JSON对象乱码解决方案、前端JavaScript与Json对象的转换,以及后台Java对象与Json对象的转换。重点探讨了使用Jackson和FastJson两个库进行Json操作的方法,提供了具体的代码示例和配置建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

json的使用

我们广义上说的后端开发提供接口,其实指的是我们在Controller层定义的域名:端口号/请求名
前端获取这个请求,去赋给比如表单的action,获取相应的结果集并展示。

json:轻量级的数据交换格式

json采用键值对的形式来保存JavaScript的数据,形式类似于:
var json = ‘{“name”:“wang”,“age”:“13”}’;

如果针对一个类进行注解@RestController,那么这个控制类下的所有方法返回的都是字符串,而不是用视图解析器返回视图

后端返回给前端的JSON对象乱码问题

单独解决:

    @RequestMapping(value = "j1",produces = "application/json;charaset=utf-8")

配置解决,通过在Spring核心配置文件中的注解驱动来解决:

    <mvc:annotation-driven>
        <mvc:message-converters>
            <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>

前台如何进行javascript对象与json对象转换

var obj = JSON.parse( ‘{“name”:“wang”,“age”:“13”}’);
var json = JSON.stringify({name:‘wang’,age:‘13’});

这个JSON是html自带的一个对象

后台如何进行java对象与json对象转换

其实从本质上来说,json并不是一种新的数据格式,它就是有特定格式的字符串,只不过经过了转换。
测试Json的时候,给控制类上加一个@RestController,防止返回字符串被视图解析器解析成视图返回了。
或者在测试的方法上加一个@ResponseBody,可以有同样效果,但是这个针对单个方法。

一)、使用jackson的方式进行Json数据操作

使用jackson必须要导入依赖:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.0</version>
</dependency>

使用方法如下:
创建使用对象ObjectMapper mapper = new ObjectMapper();
然后mapper.writeValueAsString(object);就可以返回一个JSON格式的字符串
返回前台可以显示。

    @RequestMapping("/j1")
//    @ResponseBody  写上这个注解,这个方法就不会走视图解析器,就会直接返回一个字符串
    public String Json01(){
        //创建一个对象
        User user = new User("wang", 13, "男");
        String str = "";
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            str = objectMapper.writeValueAsString(user);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return str;
        //return JsonUtils.getJson(user);
    }

由于JSON的使用非常频繁,而如果每次使用都要不停的去创建ObjectMapper有点影响阅读,因此把它写到工具类中。

package com.wang.utils;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

import java.text.SimpleDateFormat;
import java.util.Date;

public class JsonUtils {

    public static String getJson(Object object){
        return getJson(object,"yyyy-MM-dd HH:mm:ss");
    }


    public static String getJson(Object object,String dateFormate) {
        ObjectMapper mapper = new ObjectMapper();
        //关闭时间戳定义时间格式
        mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS,false);

        SimpleDateFormat sdf = new SimpleDateFormat(dateFormate);
        mapper.setDateFormat(sdf);
        String s = null;
        try {
            s = mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return s ;
    }
}

以上是包含了目前两个方法

  • 第一个方法调用了第二个方法,不影响其传入参数的变化。
  • 第二个主要是针对时间的操作,先是定义了时间的显示方式,更改了时间戳的显示,然后根据传入的时间格式返回相关字符串。

使用工具类进行Json的传递:

    @RequestMapping(value = "j2")
    public String Json02() throws JsonProcessingException {
        User user1 = new User("梁志斌", 13, "男");
        User user2 = new User("卢崛", 13, "女");
        User user3 = new User("李元浩", 13, "男");
        User user4 = new User("孙亚龙", 13, "男");
        List<User> userlist = new ArrayList<User>();
        userlist.add(user1);
        userlist.add(user2);
        userlist.add(user3);
        userlist.add(user4);
//        ObjectMapper objectMapper = new ObjectMapper();
//        String str = objectMapper.writeValueAsString(userlist);
        return JsonUtils.getJson(userlist);
    }

二)、使用FastJson的方式进行数据操作

这个是阿里的工具类,同样也需要导入相关依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

使用方法也非常简单,直接JSON.toJSONString(Object)就可以获得一个Json格式字符串

    //    fastjson的使用
    @RequestMapping("/j4")
    public String Json04(){
        User user1 = new User("梁志斌", 13, "男");
        User user2 = new User("卢崛", 13, "女");
        User user3 = new User("李元浩", 13, "男");
        User user4 = new User("孙亚龙", 13, "男");

        List<User> userlist = new ArrayList<User>();
        userlist.add(user1);
        userlist.add(user2);
        userlist.add(user3);
        userlist.add(user4);

        String s = JSON.toJSONString(userlist);

        return s;
    }

    @RequestMapping("/j5")
    public String Json05(){
    User user1 = new User("梁志斌", 13, "男");
        return JSON.toJSONString(user1);
    }

    @RequestMapping("/j6")
    public String Json06(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return JSON.toJSONString(sdf.format(new Date()));
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值