记录生活中的点点滴滴

0%

json

JSON 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于阅读和编写,同时也易于解析和生成,并有效地提升网络传输效率。

JSON 语法

(1)数据在名称/值对中
(2)数据由逗号分隔
(3)大括号保存对象
(4)中括号保存数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
name: "中国",
provinces: [
{
name: "黑龙江",
citys: {
city: ["哈尔滨", "大庆"]
}
},
{
name: "广东",
citys: {
city: ["广州", "深圳", "珠海"]
}
}
]
}

Java解析 JSON

一个实体类:用于与 JSON 数据进行相互转换

1
2
3
4
5
6
7
8
9
10
11
public class Person {
private String name;
private String sex;
private int age;
public Person(String name, String sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
....
}

传统JSONObject方式

导包:import com.alibaba.fastjson.JSONObject;

由实体类生成 JSON 字符串:

1
2
3
4
5
6
7
@Test
public void Test1(){
JSONObject jsonObject = new JSONObject();
Person person = new Person("张三", "男", 20);
String s = jsonObject.toJSONString(person);
System.out.println(s);//{"age":20,"name":"张三","sex":"男"}
}

JSON 字符串生成实体类:

1
2
3
4
5
6
7
8
//由Json字符串生成实体类
@Test
public void Test2(){
String json = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":25}";
JSONObject jsonObject = new JSONObject();
Person person = jsonObject.parseObject(json, Person.class);
System.out.println(person);//Person{name='张三', sex='男', age=25}
}

Jackson方式

导包 com.fasterxml.jackson.core 里的三个包,jackson-annotations jackson-core jackson-databind 全都要的。

由实体类生成 JSON 字符串:

1
2
3
4
5
6
7
@Test
public void Test1() throws JsonProcessingException {
Person person = new Person("张三", "男", 20);
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(person);
System.out.println(s);//{"name":"张三","sex":"男","age":20}
}

JSON 字符串生成实体类:

1
2
3
4
5
6
7
8
9
@Test
public void Test2() throws IOException {
String json = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":25}";
ObjectMapper objectMapper = new ObjectMapper();
//要确保Person类有无参构造方法,不然会报错
// com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.XX.Info`
Person person = objectMapper.readValue(json, Person.class);
System.out.println(person);//Person{name='张三', sex='男', age=25}
}

GSON方式

导包:import com.google.gson.Gson;

由实体类生成 JSON 字符串:

1
2
3
4
5
6
7
@Test
public void Test1(){
Person person = new Person("张三", "男", 20);
Gson gson = new Gson();
String s = gson.toJson(person);
System.out.println(s);//{"name":"张三","sex":"男","age":20}
}

JSON 字符串生成实体类:

1
2
3
4
5
6
7
@Test
public void Test2() throws IOException {
Gson gson = new Gson();
String jsonContent = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":25}";
Person person = gson.fromJson(jsonContent, Person.class);
System.out.println(person);//Person{name='张三', sex='男', age=25}
}

FastJSON方式

导包 import com.alibaba.fastjson.JSON;

由实体类生成 JSON 字符串:

1
2
3
4
5
6
@Test
public void Test1(){
Person person = new Person("张三", "男", 20);
Object o = JSON.toJSON(person);
System.out.println(o.toString());//{"sex":"男","name":"张三","age":20}
}

JSON字符串生成实体类:

1
2
3
4
5
6
@Test
public void Test2() throws IOException {
String json = "{\"sex\":\"男\",\"name\":\"张三\",\"age\":25}";
Person person = JSON.parseObject(json, Person.class);
System.out.println(person);//
}

这次会报异常:

1
java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlAccessorType

原因:高版本的JDK中不包含javax.xml.bind包了!

要引入这个jar包:javax.xml.bind 下载地址

但是当我们引入这个jar包的时候可能还会出现一个问题,就是数据为空的问题。

FastJSON 解析的是利用反射通过setXxx()为对象赋值,这也就是为什么我们的javabean必须有getXxx()和setXxx()方法的原因。而且这个get和set方法必须遵循标准驼峰原则。