JSON的使用进行数据交互

JSON:(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,其采用完全独立于编程语言的文本格式来存储和表示数据,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

JSON的语法:

对象表示为键值对

{"id":"1"}
{"name":"暮凌寒雪"}
{"age":"18"}

数据由逗号分隔

var json={a:"mlxh",b:"MLXH"}

花括号保存对象

{a:"mlxh",b:"MLXH"}

方括号保存数组

[1,2,{age:"18"},3,{name:"MLXH"}]
JSON和JS的区别

JSON 和 Js 对象的关系:
JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
JS对象:

var obj = {a: 'Hello', b: 'World'}; //注意键名也是可以使用引号包裹的

JSON字符串

var json = '{"a": "Hello", "b": "World"}'; 
JSON和JS的相互转换
  1. JSON字符串转换为JS对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {"a": "Hello", "b": "World"}
  1. 从JS对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'}); 
//结果是 '{"a": "Hello", "b": "World"}'
从后台传递JSON数据

导个包:
json解析工具:

  1. Jackson
  2. fastjson
    这里我们使用Jackson
 <!--https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
     <version>2.9.8</version>
 </dependency>

对象的实体类

package com.MLXH.controller;

public class User {
    private int id ;
    private String name;
    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

接着写controller

package com.MLXH.controller;

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;
@Controller
public class jsonController {
    @RequestMapping("/json")
    @ResponseBody
    public String jsonDemo() throws JsonProcessingException {
        //创建一个jackson的对象映射器,用来解析数据
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User(1, "暮凌寒雪", 18);
        //将我们的对象解析成为json格式
        String str = mapper.writeValueAsString(user);
        return str; //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
    }
}

注解解释:

  • @Controller: 将这个类交给Spring 来进行托管(具体可以看之前的一篇博客,SpringMVC的原理);
  • @RequestMapping("/json"):设定页面的访问地址;
  • @ResponseBody:将返回值变为一个JSON数据返回前端页面;

然后配SpringMVC的配置文件
Spring配置文件的三要素别忘了:自动扫描包,适配器解析器,视图解析器
表头是最难写的,没必要去死记硬背,这篇博客有我整理的各种配置文件的表头…有需要直接copy…Java中各种配置文件的表头代码集合
代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--自动扫描包-->
    <context:component-scan base-package="想要扫描的包名路径"/>
    <!--适配器解析器-->
    <mvc:annotation-driven/>
    <!--视图解析器-->
    <bean id="InternalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name="suffix" value=".jsp"/>
    </bean>
</beans>

看一下结果:
在这里插入图片描述
可以看到我们的姓名这块出现了???
接下来我们解决一下字符乱码问题

乱码问题解决方式1
需要设置一下他的编码格式为utf-8,以及它返回的类型;
可以通过@RequestMaping的produces属性来实现,修改下代码
 @RequestMapping(value = "/json",produces = "application/json;charset=utf-8")

再试一下:
在这里插入图片描述
这种方式呢,只能解决当前页面的,若想要项目中没个页面的JSON格式都没有乱码,就要使用到下面的方式:

乱码问题解决方式2

在配置文件的适配器解析器代码中加入编码格式如下:

<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乱码问题的…

JSON时间日期返回问题

注意的点:若是在后台创建的Date对象将其转换为JSON格式输出到前端页面,Jackson 默认是转成timestamps形式,会变成一个数字,是1970年1月1日到当前日期的毫秒数!
那如何使它返回的json字符串是一个常见的日期格式呢,这就需要在后台进行设置:

	@RequestMapping("/time")
    @ResponseBody
    public String json2() 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();
        String str = mapper.writeValueAsString(date);

        return str; //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便
    }

结果:ok了~
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值