2020藍旭工作室暑假討論班之JSON解析

JSON簡介

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它基於JavaScript的一個子集,易於人的編寫和閱讀,也易於機器解析。 JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 這些特性使JSON成爲理想的數據交換語言。

JAVA開發中使用GSON

因爲json有2種類型:

  • 一種是對象,object -> {key:value,key:value,…} 。
  • 另一種是數組,array -> [value,value,…] 。

所以針對這兩種類型,來展開對json數據的操作。GSON在解析json的時候,大體上有2種類型,一種是直接在內存中生成object或array,通過手工指定key來獲取值;另一種是藉助javabean來進行映射獲取值。我們主要採用第二種使用javabean來進行映射獲取。

1.對json進行反序列化得到java對象

通用示例

Gson gson = new Gson();
BeanType bean = gson.fronJson(jsonData, BeanType.class);

具體例子
Java實體類

package entity;

public class User {
    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

利用User類來解析json

package jsontest;

import com.google.gson.Gson;
import entity.User;

public class JsonToObjectDemo {
    public static void main(String[] args){
        Gson gson = new Gson();
        String jsonString = "{\"username\":\"tom\",\"password\":\"123456\"}";
        System.out.println(jsonString);
        User tom = gson.fromJson(jsonString,User.class);
        System.out.println(tom.toString());
    }
}

1.1如果字段名並不一致怎麼辦?
如果前端傳過來的json 數據的key和我們java類的字段不一致,就需要我們在java類中手工進行指定。
比如將username改成userName,這個時候我們可以使用@SerializedName("userName")註解來實現。

public class User {
    @SerializedName("userName")
    private String username;
    private String password;
}

1.2如果不想某些字段不參加序列化後者反序列化
如果想要讓java類的某些字段不參加序列化或反序列化,可以使用@Expose()註解來實現

@Expose
    @SerializedName("userName")
    private String username;

    @Expose(serialize = false,deserialize = false)
    private String password;

利用Java數組來解析json數組

對於數組形式的json數據,我們還可以反序列化爲List類型的數組。因爲List進行增刪改都比較方便。

package jsontest;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import entity.User;

import java.lang.reflect.Type;
import java.util.List;

public class JsonArrayToList {
    public static void main(String[] args){
        String jsonString = "[\n" +
                "    {\n" +
                "        \"username\": \"tom\",\n" +
                "        \"password\": \"123456\"\n" +
                "    },\n" +
                "    {\n" +
                "        \"username\": \"tony\",\n" +
                "        \"password\": \"1234567\"\n" +
                "    }\n" +
                "]";
        Gson gson = new Gson();
        Type type = new TypeToken<List<User>>(){}.getType();
        List<User> userList = gson.fromJson(jsonString,type);
    }
}

2.由java對象序列化爲JSON
我們可以直接把java對象給序列化爲json數據。對於未設置的屬性,會採取默認值;但是如果默認是null的話,該屬性就不會被序列化。

package jsontest;

import com.google.gson.Gson;
import entity.User;

import java.util.ArrayList;
import java.util.List;

public class ListToJsonDemo {
    public static void main(String[] args){
        User tom = new User();
        User tony = new User();
        tom.setUsername("tom");
        tom.setPassword("123456");
        tony.setUsername("tony");
        tony.setPassword("1234567");
        List<User> userList = new ArrayList<>();
        userList.add(tom);
        userList.add(tony);
        Gson gson = new Gson();
        String jsonString = gson.toJson(userList);
        System.out.println(jsonString);
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章