JAVA学习笔记之JSON解析

目录

  • 什么是JSON?
  • 如何在JAVA中使用JSON
  • Gson
  • FastJson
  • Gson 与 FastJson 在将对象转换为 JSON 字符串的区别

什么是JSON?

JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。
JSON 分为对象格式和数组格式

  • 对象格式:以大括号({})包括对象属性,对象属性以键值对的形式存储,键以字符串
{
	"name":"三国演义",
	"info":"经典名著"
}
  • 数组形式:以([])包括,但JSON的最外层必须为{},即为对象格式,只有对象内部的属性才能使用数组形式存储
[元素1,元素2...]
{
	"city":["北京","上海","广州"]
}

如何在JAVA中使用JSON

在开发场景下,我们常常需要使用 JSON 将 Java 中的对象 快速的转换为 JSON 格式的字符串或者将 JSON 格式的字符串, 转换为 Java 的对象。但在 Java 中,官方并没有内置相关 JSON 工具类。
我们解析 JSON 通常会使用谷歌的 Gson 或者 阿里巴巴的 FastJson 等 Java 库,下面我们以 Gson 和 FastJson 为例解析JSON

Gson

  • 将对象转换为 JSON 字符串
  • 转换JSON字符串的步骤:
  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
    String json = new Gson().toJSON(要转换的对象);

案例
Person类:

public class Person {

    private String name;
    private int age;

    public Person() {
    }

    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 "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

}
Person person = new Person();
person.setName("张三");
person.setAge(19);
String json = new Gson().toJson(person);
System.out.println(json);//{"name":"张三","age":19}
  • 将JSON字符串转换为对象
  • 步骤
  1. 引入JAR包
  2. 在需要转换Java对象的位置, 编写如下代码:
    对象 = new Gson().fromJson(JSON字符串,对象类型.class);
  • 案例
String s = "{\"name\":\"张三\",\"age\":19}";
Person person = new Gson().fromJson(s, Person.class);
System.out.println(person); //Person{name='张三', age=19}
  • 如果在中不存在对应的对象,我们可以把 JSON 转换为 Map 集合
  • 案例
String s = "{\"name\":\"张三\",\"age\":19,\"parent\":[\"李四\",\"王五\"]}";
HashMap map = new Gson().fromJson(s, HashMap.class);
List parent = (List) map.get("parent");
System.out.println(parent.get(1));

FastJson

  • 将对象转换为JSON字符串
  • 转换JSON字符串的步骤:
  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
    String json=JSON.toJSONString(要转换的对象);
  • 案例
Person person = new Person();
person.setName("赵六");
person.setAge(30);
String json = JSON.toJSONString(person);
System.out.println(json);//{"age":30,"name":"赵六"}
  • 将JSON字符串转换为对象
  • 步骤
  1. 引入JAR包
  2. 在需要转换Java对象的位置, 编写如下代码:
    类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
    List<类型> list=JSON.parseArray(JSON字符串,类型.class);
  • 案例
String s = "{\"age\":30,\"name\":\"赵六\"}";
Person person = JSON.parseObject(s, Person.class);
System.out.println(person);//Person{name='赵六', age=30}
  • 将 JSON 数组转换为List对象
List<String> list = JSON.parseArray("[\"王五\",\"李四\",\"张三\"]",String.class);
System.out.println(list.get(1));//李四

Gson 与 FastJson 在将对象转换为 JSON 字符串的区别

  • Gson在转换 Person 对象得到的 JSON 字符串是 {"name":"张三","age":19}
  • FastJson在转换 Person 对象得到的 JSON 字符串是 {"age":30,"name":"赵六"}
  • 从上面就可以看出,两者返回的字符串是有区别的,其键的顺序不同
  • 我们来测试一下它们的排序方式,为 Person 类添加一个 sex 属性
    修改后的 Person 类:
public class Person {

	private String name;
	private int age;
	private char sex;

	public Person() {
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}


	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 "Person{" +
				"name='" + name + '\'' +
				", age=" + age +
				", sex=" + sex +
				'}';
	}

	@Override
	public boolean equals(Object o) {
		if (this == o) return true;
		if (o == null || getClass() != o.getClass()) return false;
		Person person = (Person) o;
		return age == person.age &&
				sex == person.sex &&
				Objects.equals(name, person.name);
	}

	@Override
	public int hashCode() {
		return Objects.hash(name, age, sex);
	}
}

Gson:重新将对象转换为JSON字符串

Person person = new Person();
    person.setAge(19);
    person.setSex('男');
    person.setName("张三");
    String json = new Gson().toJson(person);
    System.out.println(json);//{"name":"张三","age":19,"sex":"男"}

从结果我们并不能看出其顺序,我们尝试调整在 Person 类的 sex 属性的声明位置进行调整
原先顺序:

private String name;
private int age;
private char sex;

修改后顺序:

private String name;
private char sex;
private int age;

我们再进行测试

Person person = new Person();
person.setAge(19);
person.setSex('男');
person.setName("张三");
String json = new Gson().toJson(person);
System.out.println(json);//{"name":"张三","sex":"男","age":19}

通过对比我们可以发现通过 Gson 转换得到的 JSON 字符串中的属性是根据其在对象中的声明顺序进行排序的

FastJson:

Person person = new Person();
person.setName("赵六");
person.setSex('男');
person.setAge(30);
String json = JSON.toJSONString(person);
System.out.println(json);//{"age":30,"name":"赵六","sex":"男"}

从返回结果我们可以看出 FastJson 转换的 JSON 字符串的属性其顺序是是根据按属性名的ASCll码决定的