SpringMVC-08-JSON

SpringMVC-08-JSON

概述

JSON(JavaScript Object Notaion,JS对象标记)是一种轻量级的数据交互格式,目前使用特别广泛

采用完全独立于编程语言的文本格式来存储和表示数据

简洁和清晰的层次结构使得JSON成为理想的数据交互语言(在前后端分离时代,尤为突出)

易于人阅读和编写,同时也易于机器解析和生成,并可以有效地提升网络传输效率

JavaScript对象和JSON的区别

var obj = {a:'Hello',b:'world'};//这是一个对象,键名也可以使用引号包裹
var json='{"a":"Hello","b":"world"}';//这是一个JSON字符串,本质是一个字符串

JavaScript对象和JSON的互相转换

<script>
    //编写一个js对象
    var user={
        id:1,
        name:"void",
        age:18
    }
    console.log(user);
    //将js对象转成json对象
    var json = JSON.stringify(user);
    console.log(json);

    //将json对象---->js对象
    var obj = JSON.parse(json);
    console.log("----------------------")
    console.log(obj);
</script>

image-20210326172123845

Controller返回JSON数据

常用的工具

  • Jackson
  • 阿里的fastjson
  • 自己写

Jackson

导入依赖

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

配置必要的web.xml,springmvc-servlet.xml

实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private int id;
    private String name;
    private int age;
}

补充:如何让controller只返回字符串,而不走视图解析器?

@RequestMapping("/j1")
@ResponseBody
//or
@RestController

测试

@Controller
public class UserController {
    @RequestMapping("/j1")
    @ResponseBody //不走视图解析器的注解,会直接返回字符串 @RestController 替换这两个注释也能达成一样的效果
    public String json01() throws JsonProcessingException {
        //Jackson ObjectMapper
        ObjectMapper mapper = new ObjectMapper();
        //创建一个对象
        User user = new User(1, "通天塔", 18);
        String str = mapper.writeValueAsString(user);
        return str;
    }
}

image-20210327102216399

发现存在乱码问题

json乱码解决方法一

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

json乱码解决方法二

上一种方法不免繁琐,每个路径映射都要添加

更好的解决方案:在springmvc-servlet.xml添加配置

<!-- 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>

Jackson将集合转JSON字符串

@RequestMapping("/j2")
    public String json02() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        ArrayList<User> users = new ArrayList<User>();
        User user1 = new User(1, "明天01", 18);
        User user2 = new User(2, "明天02", 18);
        User user3 = new User(3, "明天03", 18);
        User user4 = new User(4, "明天04", 18);
        users.add(user1);
        users.add(user2);
        users.add(user3);
        users.add(user4);

        String str = mapper.writeValueAsString(users);
        return str;
    }

image-20210327103802594

Jackson对日期进行处理

法一:

@RequestMapping("/j3")
public String json03() 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));
}

法二:

@RequestMapping("/j4")
public String json04() 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);
}

抽象工具类

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 sdf){

        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sdf);
        mapper.setDateFormat(simpleDateFormat);
        try {
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        return null;
    }

}

FastJson

fastjson.jar是阿里开发的一款专门用于Java开发的包,可以方便的实现

json对象和JavaBean对象的转换

实现JavaBean对象和json字符串的转换

实现json对象和json字符串的转换

依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.61</version>
</dependency>

测试

@RequestMapping("/j5")
public String json05(){
    ArrayList<User> users = new ArrayList<User>();
    User user1 = new User(1, "明天01", 18);
    User user2 = new User(2, "明天02", 18);
    User user3 = new User(3, "明天03", 18);
    User user4 = new User(4, "明天04", 18);
    users.add(user1);
    users.add(user2);
    users.add(user3);
    users.add(user4);
    //Java对象转JSON字符串
    String str1 = JSON.toJSONString(users);
    System.out.println("Java对象转JSON字符串:"+str1);
    //JSON字符串转Java对象
    String str2 = JSON.toJSONString(user1);
    User user = JSON.parseObject(str2,User.class);
    System.out.println("JSON字符串转Java对象:"+user);
    //Java对象转JSON对象
    JSONObject jo = (JSONObject) JSON.toJSON(user2);
    System.out.println("Java对象转JSON对象:"+jo.getString("id"));
    //JSON对象转Java对象
    User user5 = JSON.toJavaObject(jo, User.class);
    System.out.println("JSON对象转Java对象:"+user5);

    return "fastjsontest";
}

out

Java对象转JSON字符串:[{"age":18,"id":1,"name":"明天01"},{"age":18,"id":2,"name":"明天02"},{"age":18,"id":3,"name":"明天03"},{"age":18,"id":4,"name":"明天04"}]
JSON字符串转Java对象:User(id=1, name=明天01, age=18)
Java对象转JSON对象:2
JSON对象转Java对象:User(id=2, name=明天02, age=18)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值