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() { returnname; } 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的基本使用
原始碼已上傳: