JSON基礎及Java的JSON工具類
阿新 • • 發佈:2019-01-01
一.JSON基礎
定義:JSON(JavaScript Object Notation, JS 物件簡譜) 是一種輕量級的資料交換格式。它基於 ECMAScript (歐洲計算機協會制定的js規範)的一個子集,採用完全獨立於程式語言的文字格式來儲存和表示資料。簡潔和清晰的層次結構使得 JSON 成為理想的資料交換語言。 易於人閱讀和編寫,同時也易於機器解析和生成,並有效地提升網路傳輸效率。
1.JSON 指的是 JavaScript 物件表示法(JavaScript Object Notation)
2.JSON 是輕量級的文字資料交換格式
3.JSON 獨立於語言 *
4.JSON 具有自我描述性,更易理解
5. JSON 使用 JavaScript 語法來描述資料物件,但是 JSON 仍然獨立於語言和平臺。JSON 解析器和 JSON 庫支援許多不同的程式語言。
語法:在 JS 語言中,一切都是物件。因此,任何支援的型別都可以通過 JSON 來表示,例如字串、數字、物件、陣列等。但是物件和陣列是比較特殊且常用的兩種型別:
**1.物件表示為鍵值對
2.資料由逗號分隔
3.花括號儲存物件
4.方括號儲存陣列**
1>.物件轉為JSON字串
public class JsonTest {
@Test
public void test1(){
try {
Address addr = new Address();
addr.setHomeAddr("西安");
addr.setBusiAddr("北京");
addr.setSchoolAddr("西安");
addr.setPhone("18039489556");
Student st = new Student();
st.setName("張三");
st.setId(1111);
st.setSex('男');
st.setAge (18);
st.setAddress(addr);
Address addr1 = new Address();
addr1.setHomeAddr("成都");
addr1.setBusiAddr("杭州");
addr1.setSchoolAddr("成都");
addr1.setPhone("13992526211");
Student st1 = new Student();
st1.setName("李四");
st1.setId(2222);
st1.setSex('男');
st1.setAge(19);
st1.setAddress(addr1);
//建立學生物件
Student[] students = new Student[]{st, st1};
//將物件通過對映轉換為jsonvalue的json字串
JSONValue jsonValue = JSONMapper.toJSON(students);
//將字串排列
String jsonStr = jsonValue.render(true);
//控制檯輸出json字串
System.out.println(jsonStr);
//不將字串排列
String jsonStr1 = jsonValue.render(false);
System.out.println(jsonStr1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
控制檯輸出:
①jsonValue.render(true)—-字串排列後:
[
{
"address" :
{
"busiAddr" : "北京",
"homeAddr" : "西安",
"phone" : "18039489556",
"schoolAddr" : "西安"
},
"age" : 18,
"id" : 1111,
"name" : "張三",
"sex" : "男"
},
{
"address" :
{
"busiAddr" : "杭州",
"homeAddr" : "成都",
"phone" : "13992526211",
"schoolAddr" : "成都"
},
"age" : 19,
"id" : 2222,
"name" : "李四",
"sex" : "男"
}
]
②jsonValue.render(false)—-json字串未排列:
[{"address":{"busiAddr":"北京","homeAddr":"西安","phone":"18039489556","schoolAddr":"西安"},"age":18,"id":1111,"name":"張三","sex":"男"},{"address":{"busiAddr":"杭州","homeAddr":"成都","phone":"13992526211","schoolAddr":"成都"},"age":19,"id":2222,"name":"李四","sex":"男"}]
其中Student類,Address類
Student類:
public class Student {
private String name;
private int id;
private int age;
private char sex;
private Address address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
}
Address類:
public class Address {
private String homeAddr;
private String busiAddr;
private String schoolAddr;
private String phone;
public String getHomeAddr() {
return homeAddr;
}
public void setHomeAddr(String homeAddr) {
this.homeAddr = homeAddr;
}
public String getBusiAddr() {
return busiAddr;
}
public void setBusiAddr(String busiAddr) {
this.busiAddr = busiAddr;
}
public String getSchoolAddr() {
return schoolAddr;
}
public void setSchoolAddr(String schoolAddr) {
this.schoolAddr = schoolAddr;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
}
在實際專案中:json字串不排列將節省很多字元,可以增加有用資料的傳輸量
2>.將字串轉換為物件
注意:需要轉json值的字串中的雙引號格式為: \”string\”
@Test
public void test2(){
try {
String jsonStr = "{\"address\":{\"busiAddr\":\"北京\",\"homeAddr\":\"西安\",\"name\":\"張三\",\"sex\":\"男\"}";
JSONValue jsonValue = new JSONParser(new StringReader(jsonStr)).nextValue();
Student s = (Student)JSONMapper.toJava(jsonValue, Student.class);
System.out.println("name" + ":" + s.getName());
System.out.println("id" + ":" + s.getId());
System.out.println("age" + ":" + s.getAge());
System.out.println("address" + ":" + s.getAddress());
System.out.println("sex" + ":" + s.getSex());
} catch (Exception e) {
e.printStackTrace();
}
}
控制檯輸出Student物件資料:
name:張三
id:1111
age:18
address:testUnit1.Address@69222c14
sex:男
二.JSON工具類
工具類:
public class JSONUtil {
/**
* 將物件轉為Json串
* @param o
* @return
*/
public static String toJson(Object o){
String str = null;
try {
str = JSONMapper.toJSON(o).render(false);
} catch (MapperException e) {
e.printStackTrace();
}
return str;
}
/**
* 將字串轉為Java物件
* @param jsonStr
* @return
*/
public static Object toJava(String jsonStr){
Object o = null;
try {
o = JSONMapper.toJava(new JSONParser(new StringReader(jsonStr)).nextValue(), GamePackage.class);
} catch (TokenStreamException e) {
e.printStackTrace();
} catch (RecognitionException e) {
e.printStackTrace();
} catch (MapperException e) {
e.printStackTrace();
}
return o;
}
}
用法:
1.將VO包轉換為JSON串:
VO(value object) 值物件 通常用於業務層之間的資料傳遞。
//GamePackage為VO包
GamePackage gp = new GamePackage();
//轉為JSON串
String jsonString = JSONUtil.toJson(gp);
//傳送資料包,9999為接收埠
DatagramPacket packet = new DatagramPacket(jsonString.getBytes(),jsonString.getBytes().length, InetAddress.getByName(ip), 9999);
ds.send(packet);
2.將json串轉為VO物件包
//準備接收的資料包
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
try {
//接收資料包
ds.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
//得到字串(資料, 開始位元組, 資料長度)
String jsonStr = new String(packet.getData(),0, packet.getLength());
GamePackage pkg = (GamePackage)JSONUtil.toJava(jsonStr);