java学习之json篇——java-json、gson、fastjson、jackson的使用

建立实体类

user

package com.jock168.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

import java.time.LocalDate;
/**
 * @Description TODO
 * @Author Jock
 * @Date 2021/11/14
 */
// 用于指定生成JSON串的属性顺序
@JsonPropertyOrder({"age", "user_name"})
public class User {
    // 重命名属性的注解
    @JsonProperty("user_name")
    private String name;
    @JsonProperty("age")
    private int age;
    // 指定日期格式的注解
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
    private LocalDate birth;
    // 指定在JSON串中不生成此属性
    @JsonIgnore
    private String gender;

    public User() {
    }

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

    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;
    }

    public LocalDate getBirth() {
        return birth;
    }

    public void setBirth(LocalDate birth) {
        this.birth = birth;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

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

student

package com.open.entity;

/**
 * @Description TODO
 * @Author Jock
 * @Date 2021/11/11
 *
 * alt+insert
 */
public class Student {
    private int id;
    private String name;
    private int age;
    private String gender;

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

    public Student() {
    }

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

    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;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

使用java-json实现json格式转字符串和字符串转json

package com.open.test;

import com.open.entity.Student;
import org.json.JSONObject;
import org.junit.Test;

/**
 * @Description TODO
 * @Author Jock
 * @Date 2021/11/11
 * ctrl+shift+enter,自动补全 alt+/   alt+enter
 */
public class JsonTest {
    @Test
    public void testJsonToStudent() {
        // 1. 提供要转换的 JSON 字符串
        String json = "{\"gender\":\"男\",\"name\":\"张三\",\"id\":1,\"age\":20}";
        // 2. 创建 JSONObject 对象
        JSONObject object = new JSONObject(json);
        // 3. 调用 get(String key)
        Student student = new Student();
        student.setId(object.getInt("id"));
        student.setName(object.getString("name"));
        student.setAge(object.getInt("age"));
        student.setGender(object.getString("gender"));
        System.out.println(student);
    }

    @Test
    public void testStudentToJson() {
        // 把 Student 对象转换为 JSON 字符串
        Student student = new Student(1, "张三", 20, "男");

        // JSON-java 中的方法
        // 要想使用 JSON官网提供的解析JSON工具,必须先创建 JSONObject对象
        JSONObject object = new JSONObject(student);
        // 调用 JSONObject 对象的 toString() 方法就会生成JSON字符串了
        String json = object.toString();
        System.out.println(json);
    }
}

gson

package com.xianopen.test;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;
import com.xianopen.entity.Student;
import org.junit.Test;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Gson 提供了 fromJson()  和 toJson() 两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。
 *
 * 创建Gson 对象有两种方式:
 * 1. 调用构造器创建
 *   Gson gson = new Gson();
 * 2. 调用 Builder 创建
 *   Gson gson = new GsonBuilder();
 *
 *   Gson gson = new GsonBuilder()
 *     	// 宽松
 *     	.setLenient()
 *         // 序列化null
 *         .serializeNulls()
 *     	// 支持 Map 复杂对象
 *         .enableComplexMapKeySerialization()
 *         // 设置日期时间格式,在序列化和反序化时均生效
 *         .setDateFormat("yyyy-MM-dd")
 *         // 禁此序列化内部类
 *         .disableInnerClassSerialization()
 *         // 生成不可执行的Json(多了 )]}' 这4个字符)
 *         .generateNonExecutableJson()
 *         // 禁止转义html标签
 *         .disableHtmlEscaping()
 *         // 格式化输出
 *         .setPrettyPrinting()
 *         .create();
 */
public class GsonTest {
    @Test
    public void testJsonToMap() {
        String json = "{\"1\":{\"id\":1,\"name\":\"张三\",\"age\":20},\"2\":{\"id\":2,\"name\":\"李四\",\"age\":21},\"3\":{\"id\":3,\"name\":\"王五\",\"age\":22},\"4\":{\"id\":4,\"name\":\"赵六\",\"age\":23}}";

        Gson gson = new Gson();
        Map<Integer, Student> map = gson.fromJson(json, new TypeToken<Map<Integer, Student>>() {
        }.getType());
        System.out.println(map);
    }
    @Test
    public void testMapToJson() {
        Map<Integer, Student> stus = new HashMap<>();
        stus.put(1, new Student(1, "张三", 20));
        stus.put(2, new Student(2, "李四", 21));
        stus.put(3, new Student(3, "王五", 22));
        stus.put(4, new Student(4, "赵六", 23));

        String json = new Gson().toJson(stus);
        System.out.println(json);
    }

    @Test
    public void testJsonToList() {
        //List<Student> List<Object>
        String json = "[{\"id\":1,\"name\":\"张三\",\"age\":20},{\"id\":2,\"name\":\"李四\",\"age\":21},{\"id\":3,\"name\":\"王五\",\"age\":22},{\"id\":4,\"name\":\"赵六\",\"age\":23}]";
        Gson gson = new Gson();
        List list = gson.fromJson(json, new TypeToken<List<Student>>(){}.getType());
        System.out.println(list);
        System.out.println(list.size());
        System.out.println(list.get(0));
        //System.out.println(list.get(0).getId());
    }

    @Test
    public void testListToJson() {
        // 复制的快捷键 ctrl + d
        List<Student> stus = new ArrayList<>();
        stus.add(new Student(1, "张三", 20));
        stus.add(new Student(2, "李四", 21));
        stus.add(new Student(3, "王五", 22));
        stus.add(new Student(4, "赵六", 23));
        Gson gson = new Gson();
        String json = gson.toJson(stus);
        System.out.println(json);
    }



    @Test
    public void testReflact() throws Exception {
        Class<Student> clazz = Student.class;

        Student stu = clazz.getDeclaredConstructor().newInstance();

        // 获取字段
        //Field[] fields = clazz.getFields();
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            System.out.println(field.getName());
            field.setAccessible(true);
            if (field.getName().equals("id")) {
                field.set(stu, 5);
            }
            if (field.getName().equals("name")) {
                field.set(stu, "王五");
            }
        }
        System.out.println(stu);

    }

    @Test
    public void testJsonToStudent() {
        // 1. JSON字符串
        String json = "{\"id\":1,\"name\":\"张三\",\"age\":18}";

        // 2. 创建Gson对象
        Gson gson = new GsonBuilder().create();

        // 3. 调用fromJson()
        Student student = gson.fromJson(json, Student.class);
        System.out.println(student);
    }
    @Test
    public void testStudentToJson() {
        // 1. 创建被转换的对象
        Student student = new Student();
        /*student.setId(1);
        student.setName("张三");
        student.setAge(18);*/

        // 2. 创建 Gson 对象
        Gson gson = new Gson();

        // 3. 调用 toJson() 方法
        String json = gson.toJson(student);
        System.out.println(json);
    }
}

fastjson

package com.jock168.test;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.jock168.entity.User;
import org.junit.Test;

import java.util.*;

public class FastJsonTest {
    @Test
    public void testMapToJSON() {
        Map<Integer, User> map = new HashMap<>();
        map.put(1, new User("张三", 18, new Date()));
        map.put(2, new User("李四", 20, new Date()));

        // 序列化
        String json = JSON.toJSONString(map);
        System.out.println(json);
        // 反序列化
        Map<Integer, User> users = JSON.parseObject(json, new TypeReference<Map<Integer, User>>() {
        });
        System.out.println(users);
    }
    @Test
    public void testListToJSON() {
        List<User> users = new ArrayList<>();
        users.add(new User("张三", 18, new Date()));
        users.add(new User("李四", 20, new Date()));

        // 序列化为JSON
        String json = JSON.toJSONString(users);
        System.out.println(json);

        // 反序列化
        List<User> us = JSON.parseObject(json, new TypeReference<List<User>>(){});
        System.out.println(us);
    }
    @Test
    public void testBeanToJSON() {
        User user = new User();
        user.setName("张三");
        user.setAge(18);
        user.setBirth(new Date());

        // Bean转JSON
        String json = JSON.toJSONString(user);
        System.out.println(json);

        // JSON 转Bean
        User u = JSON.parseObject(json, User.class);
        System.out.println(u);
    }
}

jackson

package com.jock168.test;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
import com.fasterxml.jackson.databind.type.MapType;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.jock168.entity.User;
import org.junit.Test;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/*
Jackson常用统一配置:
//在反序列化时忽略在 json 中存在但 Java 对象不存在的属性
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
//在序列化时日期格式默认为 yyyy-MM-dd'T'HH:mm:ss.SSSZ
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
//在序列化时自定义时间日期格式
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//在序列化时忽略值为 null 的属性
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
//在序列化时忽略值为默认值的属性
mapper.setDefaultPropertyInclusion(JsonInclude.Include.NON_DEFAULT);

如果项目使用的是 JDK 8 中的日期对象,那么需要额外添加 jar 支持
1. 添加 jackson-datatype-jsr310-2.13.0.jar 到项目中
2. 给 mapper 对象注册参数
    mapper.registerModule(new JavaTimeModule());

 */
public class JacksonTest {
    @Test
    public void testMapToJSON() throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        Map<Integer, User> users = new HashMap<>();

        User user = new User();
        user.setName("张三");
        user.setAge(20);
        user.setBirth(LocalDate.now());
        users.put(1, user);

        user = new User();
        user.setName("李四");
        user.setAge(21);
        user.setBirth(LocalDate.now());
        users.put(2, user);

        // 序列化
        String json = mapper.writeValueAsString(users);
        System.out.println(json);

        // 反序列化
        MapType mapType = mapper.getTypeFactory().constructMapType(Map.class, Integer.class, User.class);
        Map<Integer, User> userMap = mapper.readValue(json, mapType);

        //Map<Integer, User> userMap = mapper.readValue(json, new TypeReference<Map<Integer, User>>() { });
        System.out.println(userMap);
    }
    @Test
    public void testListToJSON() throws JsonProcessingException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());

        List<User> users = new ArrayList<>();

        User user = new User();
        user.setName("张三");
        user.setAge(20);
        user.setBirth(LocalDate.now());
        users.add(user);

        user = new User();
        user.setName("李四");
        user.setAge(21);
        user.setBirth(LocalDate.now());
        users.add(user);

        // 序列化
        String json = mapper.writeValueAsString(users);
        System.out.println(json);

        // 反序列化
        CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, User.class);
        List<User> us = mapper.readValue(json, javaType);

        //List<User> us = mapper.readValue(json, new TypeReference<List<User>>() { });
        //us.forEach(System.out::println);
        //us.forEach(u -> System.out.println(u));
        /*for (User u : us) {
            System.out.println(u);
        }*/
        for (int i = 0; i < us.size(); i++) {
            System.out.println(us.get(i));
        }
    }
    @Test
    public void testBeanToJSON() throws JsonProcessingException {
        User user = new User();
        user.setName("张三");
        user.setAge(20);
        user.setBirth(LocalDate.now());

        // 创建ObjectMapper对象
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());

        // 序列化
        String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(user);
        System.out.println(json);

        // 反序列化
        User u = mapper.readValue(json, User.class);
        System.out.println(u);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值