1. 程式人生 > >Gson基本使用 -- 解析json,jsonArray。將任意java物件轉化為json格式

Gson基本使用 -- 解析json,jsonArray。將任意java物件轉化為json格式

    Gson是一款幫助解析Json,JsonArray和將Java物件轉換為Json格式的框架。

一、將json解析為java物件

先看效果圖


程式碼實現

1.在app模組的build.gradle的dependencies中引入Gson

implementation 'com.google.code.gson:gson:2.8.2'

2.在AndroidManifest中新增網路許可權

<uses-permission android:name="android.permission.INTERNET" />

Gson解析Json物件非常簡單,只需要將Json格式對應的Java物件傳入即可。

{"id":"1","name":"name_one","age":"11"}

分析此物件格式,建立對應的Java物件

public class Message {
    private String id;
    private String name;
    private String age;
    public String getId() {
        return id;
}

    public void setId(String id) {
        this.id = id;
}

    public String getName() {
        return 
name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } @Override public String toString() { return "id = "+id+ "\nname = "+name+ "
\nage = "+age; } }

我在這個物件中重寫了toString()方法,以方便後面檢視此物件

然後使用Gson的fromJson()方法將請求到的Json物件解析成對應的Java物件

Gson gson = new Gson();
Message message = gson.fromJson(jsonString,Message.class);

public class MainActivity extends AppCompatActivity {
    
    private Button button;
    private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.text_view);
requestJson();//Volley請求Json
}
    private void requestJson() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://wkxjc.github.io/test_json.json",
                        null, new Response.Listener<JSONObject>() {
                    @Override
public void onResponse(JSONObject response) {
                        parseJsonWithGson(response.toString());//Gson解析Json物件
}
                }, null);
mQueue.add(jsonObjectRequest);
}
        });
}

    private void parseJsonWithGson(String jsonString) {
        Gson gson = new Gson();
        final Message message = gson.fromJson(jsonString,Message.class);
textView.post(new Runnable() {
            @Override
public void run() {
                textView.setText(message.toString());
}
        });
}

}

二、將jsonArray解析為ArrayList

先看效果圖


程式碼實現

Gson解析JsonArray時,使用TypeToken將陣列型別傳入到framJson()中即可

[
    { "id":"1","name":"Name One","age":"1 year" },
    { "id":"2","name":"Name Two","age":"2 years" }
]

Gson gson = new Gson();
List<Message> messageList = gson.fromJson(jsonArrayString, new TypeToken<List<Message>>(){}.getType());

完整程式碼

public class MainActivity extends AppCompatActivity {

    private Button button;
    private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.text_view);
requestJsonArray();//Volley請求JsonArray
}
    private void requestJsonArray() {
        textView.setText("");
button.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
JsonArrayRequest jsonArrayRequest = new JsonArrayRequest("https://wkxjc.github.io/test_json_array.json",
                        new Response.Listener<JSONArray>() {
                            @Override
public void onResponse(final JSONArray response) {
                                parseJsonArrayWithGson(response.toString());//Gson解析JsonArray
}
                        },null);
mQueue.add(jsonArrayRequest);
}
        });
}

    private void parseJsonArrayWithGson(String jsonArrayString) {
        Gson gson = new Gson();
        final List<Message> messageList = gson.fromJson(jsonArrayString, new TypeToken<List<Message>>(){}.getType());
textView.post(new Runnable() {
            @Override
public void run() {
                for(Message message:messageList){
                    textView.append(message.toString()+"\n");
}
            }
        });
}

}

三、解析Json套Json、Json套JsonArray、JsonArray套Json、JsonArray套JsonArray資料

先看效果圖


程式碼實現

{
  "house":"402",
  "number":"13",
  "message":
    {"age":"1 year","id":"1","name":"Name One"}
}

使用Gson解析這樣型別的資料和解析Json資料一樣,只是把巢狀的Json封裝成一個單獨的Java物件

先建立Message物件

public class Message {
    private String id;
    private String name;
    private String age;
    public String getId() {
        return id;
}

    public void setId(String id) {
        this.id = id;
}

    public String getName() {
        return name;
}

    public void setName(String name) {
        this.name = name;
}

    public String getAge() {
        return age;
}

    public void setAge(String age) {
        this.age = age;
}

    @Override
public String toString() {
        return "id = "+id+
                "\nname = "+name+
                "\nage = "+age;
}
}

然後建立Classroom物件,Classroom物件中是包含Message物件的

public class Classroom {
    private String number;
    private String house;
    private Message message;
    public String getNumber() {
        return number;
}

    public void setNumber(String number) {
        this.number = number;
}

    public String getHouse() {
        return house;
}

    public void setHouse(String house) {
        this.house = house;
}

    public Message getMessage() {
        return message;
}

    public void setMessage(Message message) {
        this.message = message;
}
    @Override
public String toString() {
        return "number = "+number+
                "\nhouse = "+house+
                "\nmessage = "+message.toString();
}
}

完整程式碼如下:

public class MainActivity extends AppCompatActivity {

    private Button button;
    private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = findViewById(R.id.button);
textView = findViewById(R.id.text_view);
requestJson();//Volley請求Json
}
    private void requestJson() {
        button.setOnClickListener(new View.OnClickListener() {
            @Override
public void onClick(View v) {
                RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://wkxjc.github.io/test_json_fixed.json",
                        null, new Response.Listener<JSONObject>() {
                    @Override
public void onResponse(JSONObject response) {
                        parseJsonWithGson(response.toString());//Gson解析Json物件
}
                }, null);
mQueue.add(jsonObjectRequest);
}
        });
}

    private void parseJsonWithGson(String jsonString) {
        Gson gson = new Gson();
        final Classroom classroom = gson.fromJson(jsonString,Classroom.class);
textView.post(new Runnable() {
            @Override
public void run() {
                textView.setText(classroom.toString());
}
        });
}

}

同理,Json套JsonArray和解析Json過程一樣,只是把巢狀的jsonArray單獨封裝一個物件即可。

JsonArray套Json的資料和解析JsonArray過程一樣,只是把巢狀json單獨封裝一個物件即可。

JsonArray套JsonArray的資料和解析JsonArray過程一樣,只是把巢狀jsonArray單獨封裝一個物件即可。

開啟會看到以下介面:


將json字串填入待格式化json文字框內,點選下方格式化就可以看到縮排後的json物件,使用此工具可以很好的幫助我們分析json格式。

使用Android Studio的GsonFormat外掛也可以分析json格式,並且GsonFormat支援根據json自動生成Java物件,非常的好用。強烈推薦安裝。在Preferences的Plugins中搜索GsonFormat並安裝


裝好外掛後重啟Android Studio,然後使用GsonFormat根據json字串生成物件:


新建一個物件類,根據自己的需要命名。然後使用Alt+S,開啟GsonFormat,(或者使用程式碼提示,Mac環境使用command+N,windows環境使用ctrl+N,找到GsonFormat並開啟),將json格式字串貼上到GsonFormat中,GsonFormat右上角的Format可以將字串格式化,點選OK可以自動根據json字串格式生成java物件。然後就可以使用此物件解析json了。需要注意的是GsonFormat生成的物件會將巢狀的物件放在當前java類中,根據key+"Bean"的方式命名,如本例中的json字串自動生成的物件格式為:

public class Message {

    /**
     * house : 402
     * number : 13
     * message : {"age":"1 year","id":"1","name":"Name One"}
     */
private String house;
    private String number;
    private MessageBean message;
    public String getHouse() {
        return house;
}

    public void setHouse(String house) {
        this.house = house;
}

    public String getNumber() {
        return number;
}

    public void setNumber(String number) {
        this.number = number;
}

    public MessageBean getMessage() {
        return message;
}

    public void setMessage(MessageBean message) {
        this.message = message;
}

    public static class MessageBean {
        /**
         * age : 1 year
         * id : 1
         * name : Name One
         */
private String age;
        private String id;
        private String name;
        public String getAge() {
            return age;
}

        public void setAge(String age) {
            this.age = age;
}

        public String getId() {
            return id;
}

        public void setId(String id) {
            this.id = id;
}

        public String getName() {
            return name;
}

        public void setName(String name) {
            this.name = name;
}
    }
}
解析json時,可以直接使用此物件去解析,需要使用MessageBean物件時通過getMessage獲取。

四、將java物件轉化為json格式

呼叫Gson的toJson()方法,就可以將任意Java物件轉換成Json物件

例如,使用上文中的Message物件和Classroom物件生成Json物件:

Gson gson = new Gson();
Message message = new Message();
message.setId("1");
message.setName("Name One");
message.setAge("1 year");
String jsonStringMessage = gson.toJson(message);

程式碼執行結果:jsonStringMessage = 

{"id":"1","name":"name_one","age":"11"}
Gson gson = new Gson();
Message message1 = new Message();
message1.setId("1");
message1.setName("Name One");
message1.setAge("1 year");
Message message2 = new Message();
message2.setId("2");
message2.setName("Name Two");
message2.setAge("2 years");
List<Message> messageList = new ArrayList<>();
messageList.add(message1);
messageList.add(message2);
String jsonArrayStringMessageList = gson.toJson(messageList);
程式碼執行結果,jsonArrayStringMessageList = 
[
    { "id":"1","name":"Name One","age":"1 year" },
    { "id":"2","name":"Name Two","age":"2 years" }
]
Gson gson = new Gson();
Classroom classroom = new Classroom();
Message message = new Message();
message.setId("1");
message.setName("Name One");
message.setAge("1 year");
classroom.setNumber("13");
classroom.setHouse("402");
classroom.setMessage(message);
String jsonStringClassroom = gson.toJson(classroom);
程式碼執行結果:jsonStringClassroom = 
{
  "house":"402",
  "number":"13",
  "message":
    {"age":"1 year","id":"1","name":"Name One"}
}

以上,就是Gson的基本使用

原始碼已上傳: