在开发有关接口的时候,我们就需要设计接口返回的数据格式,常用的数据格式有xml、json等。那么今天我们就来看看json的使用。
一.JSON 描述。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
二.语法规则。
1. JSON是由‘名称/值’对组成的集合,’名称/值‘格式例如,“key1”:value1。
2.JSON的值(value) 可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。
3.JSON有两种结构,一种是对象,另一种是数组。
(1).对象(object),是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号) 分 隔。 是由{}括起来的,格式例如,{"key1":value1,"key2":value2,"key3":value3,...}。
(2).数组(array) ,是值(value)的有序集合。一个数组以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔,是由[]括起来的。格式例如,[{"key1":value1,"key2":value2,"key3":value3},{"key1":value1,"key2":value2,"key3":value3}...]。
三.JSON解析。
1. 新建测试项目。
实体类,
-
public class Person {
-
private int id;
-
private String name;
-
private int age;
-
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 toString() {
-
return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
-
}
-
}
使用GSON和JackJson分别解析。
2. GSON。GSON是Google开发的Java API,用于转换Java对象和Json对象。
2.1. 首先下载导入GSON的jar。
(1).可以去github的链接,下载GSON的源码,自己编译,生成jar;
(2).也可以直接下载jar包,GSONjar包下载链接。
2.2.生成对象。
-
public static void main(String[] args) {
-
Gson gson= new Gson();
-
Person person= new Person();
-
person.setId( 1);
-
person.setName( "zhangsan");
-
person.setAge( 30);
-
String str=gson.toJson(person);
-
System.out.println(str);
-
}
{"id":1,"name":"zhangsan","age":30}
2.4.生成数组。
-
public static void main(String[] args) {
-
List<Person> list= new ArrayList<Person>();
-
Gson gson= new Gson();
-
Person person= new Person();
-
person.setId( 1);
-
person.setName( "zhangsan");
-
person.setAge( 30);
-
list.add(person);
-
Person person1= new Person();
-
person1.setId( 2);
-
person1.setName( "lisi");
-
person1.setAge( 20);
-
list.add(person1);
-
String str=gson.toJson(list);
-
System.out.println(str);
-
}
[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20}]
2.6.json解析对象。
-
public static void main(String[] args) {
-
String str= "{\"id\":1,\"name\":\"zhangsan\",\"age\":30}";
-
Gson gson= new Gson();
-
Person person=gson.fromJson(str, Person.class);
-
System.out.println(person.toString());
-
}
Person [id=1, name=zhangsan, age=30]
2.8.json解析数组。
-
public static void main(String[] args) {
-
String str = "[{\"id\":1,\"name\":\"zhangsan\",\"age\":30},{\"id\":2,\"name\":\"lisi\",\"age\":20}]";
-
Gson gson = new Gson();
-
Type type = new TypeToken<List<Person>>() {
-
}.getType();
-
List<Person> list = gson.fromJson(str, type);
-
for (Person person : list) {
-
System.out.println(person.toString());
-
}
-
}
-
Person [id= 1, name=zhangsan, age= 30]
-
Person [id= 2, name=lisi, age= 20]
3.JackJson。
Jackson框架是基于Java平台的一套数据处理工具,被称为“最好的Java Json解析器”。
Jackson框架包含了3个核心库:streaming,databind,annotations。
3.1 库下载地址。
Jackson https://github.com/FasterXML/jackson-core/wiki
Databind https://github.com/FasterXML/jackson-databind
Annotations https://github.com/FasterXML/jackson-annotations/wiki
Jackson doc https://github.com/FasterXML/jackson-docs
3.2.生成对象。
-
Person person= new Person();
-
person.setId( 1);
-
person.setName( "zhangsan");
-
person.setAge( 30);
-
ObjectMapper objectMapper = new ObjectMapper();
-
try {
-
String json=objectMapper.writeValueAsString(person);
-
System.out.println(json);
-
} catch (JsonProcessingException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
{"id":1,"name":"zhangsan","age":30}
3.4.
生成数组。
-
List<Person> list= new ArrayList<Person>();
-
Person person= new Person();
-
person.setId( 1);
-
person.setName( "zhangsan");
-
person.setAge( 30);
-
list.add(person);
-
Person person1= new Person();
-
person1.setId( 2);
-
person1.setName( "lisi");
-
person1.setAge( 20);
-
list.add(person1);
-
Person person2= new Person();
-
person2.setId( 3);
-
person2.setName( "wangwu");
-
person2.setAge( 30);
-
list.add(person1);
-
ObjectMapper objectMapper = new ObjectMapper();
-
try {
-
String json=objectMapper.writeValueAsString(list);
-
System.out.println(json);
-
} catch (JsonProcessingException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
3.5.结果。
[{"id":1,"name":"zhangsan","age":30},{"id":2,"name":"lisi","age":20},{"id":2,"name":"lisi","age":20}]
3.6.json解析对象。
-
Person person= new Person();
-
person.setId( 1);
-
person.setName( "zhangsan");
-
person.setAge( 30);
-
ObjectMapper objectMapper = new ObjectMapper();
-
try {
-
String json=objectMapper.writeValueAsString(person);
-
System.out.println(json);
-
Person info=objectMapper.readValue(json, Person.class);
-
System.out.println(info.toString());
-
} catch (JsonProcessingException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
}
3.7结果。
-
{ "id": 1, "name": "zhangsan", "age": 30}
-
Person [id= 1, name=zhangsan, age= 30]
3.8.json解析数组。
-
List<Person> list= new ArrayList<Person>();
-
Person person= new Person();
-
person.setId( 1);
-
person.setName( "zhangsan");
-
person.setAge( 30);
-
list.add(person);
-
Person person1= new Person();
-
person1.setId( 2);
-
person1.setName( "lisi");
-
person1.setAge( 20);
-
list.add(person1);
-
Person person2= new Person();
-
person2.setId( 3);
-
person2.setName( "wangwu");
-
person2.setAge( 30);
-
list.add(person1);
-
ObjectMapper objectMapper = new ObjectMapper();
-
try {
-
String json=objectMapper.writeValueAsString(list);
-
System.out.println(json);
-
Person[] persons=objectMapper.readValue(json, Person[].class);
-
for (Person info:persons) {
-
System.out.println(info.toString());
-
}
-
} catch (JsonProcessingException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
} catch (IOException e) {
-
// TODO Auto-generated catch block
-
e.printStackTrace();
-
}
-
[{ "id": 1, "name": "zhangsan", "age": 30},{ "id": 2, "name": "lisi", "age": 20},{ "id": 2, "name": "lisi", "age": 20}]
-
Person [id= 1, name=zhangsan, age= 30]
-
Person [id= 2, name=lisi, age= 20]
-
Person [id= 2, name=lisi, age= 20]
四.总结。
如果你在开发的时候没有使用第三库去解析JSON,那么解析过程是很繁琐的。使用第三方库后,解析就很方便快捷。(建议大家在解析JSON数据时,先尽量不要使用第三方库,而使用SDK提供的API去解析数据,这样你对JSON数据以及SDK都会了解的更深刻)
PS:比起XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量,但缺点在于,它的语义较差,看起来不如XML直观。