JSON交互处理


一、JSON 概述

JSON(JavaScript Object Notation, JS 对象标记)是一种轻量级的数据交换格式。与 XML 一样,JSON 也是基于纯文本的数据格式。

1.对象结构

  • 对象结构以“{”开始、以“}”结束。
  • key:value对构成
  • 其中,key 必须为 String 类型,value 可以是 String、Number、Object、Array 等数据类型。
{
    "pname":"张三",
    "password":"123456",
    "page":40
}

2.数组结构

  • 数组结构以“[”开始、以“]”结束。
{
    "sno":"201802228888",
    "sname":"张三",
    "hobby":["篮球","足球"]"college":{
        "cname":"清华大学",
        "city":"北京"
    }
}

二、JSON 数据转换

1.与JavaScript互传

    <script type="text/javascript">
        var user = {
            name:"高朗",
            age:18,
            sex:"男"
        };

        //将js对象转换为json对象
        var json = JSON.stringify(user);

        //将JSON对象转换为JavaScript对象
        var user2 = JSON.parse(json);
    </script>

2.json解析工具

(1)JSON乱码问题

  • 方法一:
    方法名前加注解:@RequestMapping(value = "/json",produces = "application/json;charset=utf-8")

  • 方法二:(推荐)

springmvc配置文件加入:

    <!--JSON乱码问题配置-->
    <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>

(2)不会走视图解析器,会直接返回一个字符串

不需要定义一个jsp页面,直接在页面上显示返回的字符串

  • 方式一:
    在需要的方法名上加上注解@ResponseBody

  • 方式二:
    如果controller类的所有方法都不需要走视图解析器,直接返回一个字符串在页面的话。
    直接把controller类上的@Controller注解改成@RestController

(3)Jackson解析工具

步骤:

  1. 导入jar包依赖
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.11.2</version>
        </dependency>
  1. JSON乱码问题配置
  2. 使用
  • 主要是导入jar包中ObjectMapper类的使用。

  • ObjectMapper.writeValueAsString(Object object)方法的作用是将传入的对象序列化为json字符串,返回给调用者。

  • 传入对象结构

    @RequestMapping("/json")
    @ResponseBody  //它就不会走视图解析器,会直接返回一个字符串
    public String json() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        User user = new User(1001,"高朗",18);
        String str = mapper.writeValueAsString(user);

        return str;
    }

在这里插入图片描述

  • 传入List集合对象
    @RequestMapping("/json2")
    @ResponseBody  //它就不会走视图解析器,会直接返回一个字符串
    public String json2() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        List<User> userList = new ArrayList<>();
        User user = new User(1001,"高朗",18);
        User user2 = new User(1001,"晓军",28);
        User user3 = new User(1001,"李红",20);
        User user4 = new User(1001,"张明",22);

        userList.add(user);
        userList.add(user2);
        userList.add(user3);
        userList.add(user4);

        return mapper.writeValueAsString(userList);
    }

在这里插入图片描述

  • 传入时间对象
    @RequestMapping("/json3")
    @ResponseBody  //它就不会走视图解析器,会直接返回一个字符串
    public String json3() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();

        Date date = new Date();
        //方式一:自定义日期格式
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


        return mapper.writeValueAsString(sdf.format(date));
    }

如果不自定义日期格式的话输出的是1970年1月1日到现在的毫秒数,Jackson默认是会把时间转成timestamps形式。

解决方式:

方式一:
自定义日期格式
方式二:
取消timestamps形式,自定义时间格式

    @RequestMapping("/json3")
    @ResponseBody  //它就不会走视图解析器,会直接返回一个字符串
    public String json3() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();

        //不用时间戳的方式
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
       
        mapper.setDateFormat(sdf);
        Date date = new Date();
        
        return mapper.writeValueAsString(date);
    }

(4)Fastjson解析工具

  • 提供服务器端、安卓客户端两种解析工具,性能表现较好。
  • 提供了 toJSONString() 和 parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方 法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。
  • 允许转换预先存在的无法修改的对象(只有class、无源代码)。
  • Java泛型的广泛支持。
  • 允许对象的自定义表示、允许自定义序列化类。
  • 支持任意复杂对象(具有深厚的继承层次和广泛使用的泛型类型)。
  1. 导入jar包依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

  1. 使用
    静态方法较多,可以直接调用,主要有以下方法常用
  • JSON.toJSONString(Object object):Java对象转JSON字符串
  • JSON.parseObject(String json,XXX.class):JSON字符串转Java对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值