【JavaEE】数据交互最理想的格式: Json 使用详情 (一文掌握Jackson+FastJson)

JSON 概述

1. 什么是 JSON

  • JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
  • 采用完全独立于编程语言的文本格式来存储和表示数据。
  • 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
  • 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:

  • 对象表示为键值对,数据由逗号分隔
  • 花括号保存对象 {}
  • 方括号保存数组 []

JSON 键值对是用来保存 JavaScript 对象的一种方式,和 JavaScript 对象的写法也大同小异,键/值对组合中的键名写在前面并用双引号 “” 包裹,使用冒号 : 分隔,然后紧接着值:

{"name": "QinJiang"}
{"age": "3"}
{"sex": "男"}

很多人搞不清楚 JSON 和 JavaScript 对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:

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

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

2. JSON 和 JavaScript 对象互转

要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

var obj = JSON.parse('{"a": "Hello", "b": "World"}'); 
//结果是 {a: 'Hello', b: 'World'}

要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'

代码测试:
创建一个 index.html,并在浏览器控制台测试:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>index</title>
</head>
<body>
hello
<script type="text/javascript">
  // 对象
  var user={name:"yxs",age:20,sex:"man"};
  // 输出对象
  console.log(user);
  // js对象转字符串
  var str=JSON.stringify(user);
  console.log(str);
  // 字符串转对象
  var obj=JSON.parse(str);

</script>

</body>
</html>

在这里插入图片描述

Controller返回JSON数据

  • Jackson应该是目前比较好的json解析工具了

  • 当然工具不止这一个,比如还有阿里巴巴的 fastjson 等等。

  • 这里使用Jackson,使用它需要导入它的jar包;

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

随便编写一个User的实体类,然后我们去编写我们的测试Controller:

package com.example.review2.model;

import lombok.Data;

@Data
public class User {
    private Integer age;
    private String name;
    private String sex;

    public User() {
    }

    public User(Integer age, String name, String sex) {
        this.age = age;
        this.name = name;
        this.sex = sex;
    }
}

1. 使用Jackson返回 json 对象 (详情见代码注释)

@Controller
@ResponseBody
public class UserController {
    // 正常返回的话会走视图解析器,而json需要返回的是一个字符串
    // 市面上有很多的第三方jar包可以实现这个功能,比如Jackson,只需要一个简单的注解就可以实现了
    //  @ResponseBody 将服务端返回的对象转换为json对象响应回去
    @RequestMapping("/json1")
    public String json1() throws JsonProcessingException {
        // 需要一个Jackson的对象映射器,其实就是一个类,使用他可以直接将对象转换为json字符串
        ObjectMapper objectMapper=new ObjectMapper();
        // 创建一个对象
        User user=new User(18,"mike","man");
        System.out.println(user);

        //将Java对象转换为json字符串
      String str=  objectMapper.writeValueAsString(user);
        System.out.println(str);

        return str;// 由于使用了  @ResponseBody 注解,这里会将str以json格式的字符串返回,十分方便

    }
}

在这里插入图片描述

2. 使用Jackson返回 json 对象数组

    @RequestMapping("/json2")
    public String json2() throws JsonProcessingException {

        List<User> userList=new ArrayList<>();
        User user1=new User(19,"hasdkh","man");
        User user2=new User(19,"hassaasddkh","man");
        User user3=new User(19,"hasasdasdasdsadkh","man");

        userList.add(user1);
        userList.add(user2);
        userList.add(user3);

        return objectMapper.writeValueAsString(userList);

    }

在这里插入图片描述

3. 使用 Jackson 返回时间(默认返回的是时间戳格式)

    @RequestMapping("/time1")
    public String json4() throws JsonProcessingException {
        Date date=new Date();
        System.out.println(date);
        // 时间默认返回的json字符串为时间戳格式(TimeStamp)
        return objectMapper.writeValueAsString(date);
    }

在这里插入图片描述

4. 配置 mapper config 返回时间格式为自定义的时间格式

    @RequestMapping("/time2")
    public String json5() throws JsonProcessingException {
        Date date=new Date();
        // 时间默认返回的json字符串为时间戳格式(TimeStamp)
        // 为了让objectMapper 不返回时间戳,关闭它的时间戳功能
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        // 时间格式化时用自定义日期格式对象
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 让mapper指定时间日期格式为 simpleDateFormat
        objectMapper.setDateFormat(simpleDateFormat);
        return objectMapper.writeValueAsString(date);
    }

在这里插入图片描述

5. 对重复代码进行抽取封装,形成json工具类

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


    public static String getJson(Object object,String dateFormat){
        ObjectMapper objectMapper=new ObjectMapper();
        // 关闭时间戳
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);
        // 自定义日期对象格式
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat(dateFormat);
        // mapper指定日期格式为 simpleDateFormat
        objectMapper.setDateFormat(simpleDateFormat);
        try {
            return objectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
           e.printStackTrace();
        }
        return null;
    }
}

这样使用一行代码就可以实现上面多行代码实现的功能了,大大简化开发啊:

    @RequestMapping("/time3")
    public String json6()  {
        return JsonTool.getJson(new Date());
    }

在这里插入图片描述

掌握这篇博客内容就可以掌握我们Java程序猿所需要的json知识了!
建议多看多练习!

类似Jackson这种工具类,我们只需要掌握使用就好了,在使用的时候在根据具体的业务去找对应的实现;类似Jackson这个工具类,还有阿里巴巴提供的 fastjson,在实现效果上是和Jackson一样的,只需要掌握一种就行,这里博主觉得Jackson使用挺方便的,就不介绍fastjson了,如果需要学习可以自行百度!

FastJson 使用示例:

诸如 Jackson 与 Fastjson 这样的解析json 的工具类,我们只要掌握如何使用api即可,fastjson使用示例代码如下:

1. 解析Java对象为json字符串

package com.yxs.dao.utils;

import com.alibaba.fastjson.JSONObject;
import com.yxs.entity.UserEntity;

import java.util.ArrayList;

public class FastJsonTest {
    public static void main(String[] args) {
        UserEntity user1=new UserEntity(1,"张三","111"); // 构造user对象
        UserEntity user2=new UserEntity(2,"李四","222");
        // 1. 将user对象转换为json字符串
        String uJson1= JSONObject.toJSONString(user1);
        System.out.println(uJson1);
        // 2. 嵌套json示例
        JSONObject jsonObject=new JSONObject();
        jsonObject.put("status",200);
        jsonObject.put("msg","ok");
        ArrayList<UserEntity> arrayList=new ArrayList<>();
        arrayList.add(user1);
        arrayList.add(user2);
        jsonObject.put("data",arrayList);
        String manyJson=jsonObject.toJSONString();
        System.out.println(manyJson);
    }
}

在这里插入图片描述

2. 嵌套json 示例

解析json字符串代码示例:

 // string 对象转 json 对象
        String jsonStr="{\"msg\":\"ok\",\"data\":[{\"id\":1,\"password\":\"111\",\"userName\":\"张三\"},{\"id\":2,\"password\":\"222\",\"userName\":\"李四\"}],\"status\":200}";
        JSONObject jsonObject2=JSONObject.parseObject(jsonStr);
        Integer status=jsonObject2.getInteger("status");
        String msg=jsonObject2.getString("msg");
        System.out.println(status);
        System.out.println(msg);
        JSONArray data=jsonObject2.getJSONArray("data");
        for (int i = 0; i < data.size(); i++) {
            JSONObject object=(JSONObject)data.get(i);
            Integer id=object.getInteger("id");
            String username=object.getString("userName");
            String password=object.getString("password");
            // 还原对象
            UserEntity userEntity=new UserEntity(id,username,password);
            System.out.println(userEntity);

在这里插入图片描述

3. Java序列化技术,将json变为Java对象(项目中常用,重点掌握)

// Java序列化技术,将json变为Java对象(项目中常用,重点掌握)
            JsonModel jsonModel= JSONObject.parseObject(jsonStr,JsonModel.class);
            System.out.println(jsonModel);

jsonModel 类:

package com.yxs.entity;

import java.util.List;

public class JsonModel {
    private Integer status;
    private String msg;
    private List<UserEntity> data;

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public List<UserEntity> getLists() {
        return data;
    }

    public void setLists(List<UserEntity> lists) {
        this.data = lists;
    }

    public List<UserEntity> getData() {
        return data;
    }

    public void setData(List<UserEntity> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "JsonModel{" +
                "status=" + status +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}

解析成功 :
在这里插入图片描述

fastjson 练习代码附上:

package com.yxs.dao.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yxs.entity.JsonModel;
import com.yxs.entity.UserEntity;

import java.util.ArrayList;

public class FastJsonTest {
    public static void main(String[] args) {
        UserEntity user1=new UserEntity(1,"张三","111"); // 构造user对象
        UserEntity user2=new UserEntity(2,"李四","222");
        // 1. 将user对象转换为json字符串
        String uJson1= JSONObject.toJSONString(user1);
        System.out.println(uJson1);
        // 2. 嵌套json示例
        JSONObject jsonObject=new JSONObject();
        jsonObject.put("status",200);
        jsonObject.put("msg","ok");
        ArrayList<UserEntity> arrayList=new ArrayList<>();
        arrayList.add(user1);
        arrayList.add(user2);
        jsonObject.put("data",arrayList);
        String manyJson=jsonObject.toJSONString();
        System.out.println(manyJson);

        System.out.println("-------------------------i am fenGe-----------------------------------");

        // string 对象转 json 对象
        String jsonStr="{\"msg\":\"ok\",\"data\":[{\"id\":1,\"password\":\"111\",\"userName\":\"张三\"},{\"id\":2,\"password\":\"222\",\"userName\":\"李四\"}],\"status\":200}";
        JSONObject jsonObject2=JSONObject.parseObject(jsonStr);
        Integer status=jsonObject2.getInteger("status");
        String msg=jsonObject2.getString("msg");
        System.out.println(status);
        System.out.println(msg);
        JSONArray data=jsonObject2.getJSONArray("data");
        for (int i = 0; i < data.size(); i++) {
            JSONObject object=(JSONObject)data.get(i);
            Integer id=object.getInteger("id");
            String username=object.getString("userName");
            String password=object.getString("password");
            // 还原对象
            UserEntity userEntity=new UserEntity(id,username,password);
            System.out.println(userEntity);

            System.out.println("-------------------------i am fenGe 2-----------------------------------");

            // Java序列化技术,将json变为Java对象(项目中常用,重点掌握)
            JsonModel jsonModel= JSONObject.parseObject(jsonStr,JsonModel.class);
            System.out.println(jsonModel);


        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值