1. 程式人生 > >JSON基礎及Java的JSON工具類

JSON基礎及Java的JSON工具類

一.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);