前言
本人學(xué)生一枚,現(xiàn)階段也是進行Android學(xué)習(xí),若文章中有什么錯誤,請大l佬指出。
每篇格言:
我可以一落千丈,我偏要一鳴驚人。
用GSON框架技術(shù)解析JSON
GSON框架的官網(wǎng):https://mvnrepository.com/artifact/com.google.code.gson/gson

image
-
如果使用
Eclipse可發(fā)選擇相應(yīng)版本的jar包進行下載 -
如果使用
Android Studio開發(fā)通過Gradle,直接添加以來,不用下載jar包

image
Gson解析JSON對象(介紹都在代碼注釋中)
重要的事說一遍:注意在使用Gson解析JSON對象時,記得創(chuàng)建JavaBean類,并且JavaBean類中的屬性名要和JSON的key的名稱相同,否則解析就會失敗
JSON數(shù)據(jù)
{
"num": 1,
"age": 20,
"data": {
"chinese": 100,
"english": 90
}
}
移動端
- 結(jié)構(gòu):

image
重要的事說兩遍:注意在使用Gson解析JSON對象時,記得創(chuàng)建JavaBean類,并且JavaBean類中的屬性名要和JSON的key的名稱相同,否則解析就會失敗
- Data
public class Data {
private int chinese;
private int english;
public int getChinese() {
return chinese;
}
public void setChinese(int chinese) {
this.chinese = chinese;
}
public int getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
@Override
public String toString() {
return "Data{" +
"chinese=" + chinese +
", english=" + english +
'}';
}
}
重要的事說三遍:注意在使用Gson解析JSON對象時,記得創(chuàng)建JavaBean類,并且JavaBean類中的屬性名要和JSON的key的名稱相同,否則解析就會失敗
- Student
public class Student {
private int num;
private int age;
private Data data;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Data getData() {
return data;
}
public void setData(Data data) {
this.data = data;
}
@Override
public String toString() {
return "Student{" +
"num=" + num +
", age=" + age +
", data=" + data +
'}';
}
}
- NetWorkUtils
public class NetWorkUtils {
private static HttpURLConnection sHttpURLConnection;
private static BufferedReader sBufferedReader;
private static InputStream sInputStream;
/**
* 通過URL獲取String
*
* @param urlStr 需要傳入的URL
* @param requestWay 需要傳入的請求方式(GET/POST)
* @return 返貨獲取的json字符串
*/
public static String sendUrlGetString(String urlStr, String requestWay) {
String jsonStr = null;
try {
// 創(chuàng)建URL對象
URL url = new URL(urlStr);
// 創(chuàng)建HttpURLConnection對象
sHttpURLConnection = (HttpURLConnection) url.openConnection();
// 設(shè)置網(wǎng)絡(luò)的請求方式
sHttpURLConnection.setRequestMethod(requestWay);
// 設(shè)置鏈接主機超時
sHttpURLConnection.setConnectTimeout(8000);
// 設(shè)置從主機讀取數(shù)據(jù)超時
sHttpURLConnection.setReadTimeout(8000);
// 獲取輸入流
sInputStream = sHttpURLConnection.getInputStream();
// 對獲取到的輸入流進行讀取
sBufferedReader = new BufferedReader(new InputStreamReader(sInputStream));
StringBuffer stringBuffer = new StringBuffer();
String line = "";
while ((line = sBufferedReader.readLine()) != null) {
stringBuffer.append(line);
}
jsonStr = stringBuffer.toString();
return jsonStr;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (sBufferedReader != null) {
try {
sBufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (sHttpURLConnection != null) {
sHttpURLConnection.disconnect();
}
}
return jsonStr;
}
}
- MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mJsonTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
Button gsonBtn = findViewById(R.id.gson_btn);
gsonBtn.setOnClickListener(this);
mJsonTxt = findViewById(R.id.json_txt);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.gson_btn:
new Thread(new Runnable() {
@Override
public void run() {
paraseJSONWithGSON(NetWorkUtils.sendUrlGetString("http://xxx:8080/JsonThree", "GET"));
}
}).start();
break;
}
}
private void paraseJSONWithGSON(final String str) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 創(chuàng)建一個Gson對象
Gson gson = new Gson();
// 調(diào)用Gson對象的fromJson(String str,Class<T> class)
// 第一個參數(shù) : 通過網(wǎng)絡(luò)請求獲取的JSON字符串
// 第二個參數(shù) : 傳入一個JavaBean對象
Student student = gson.fromJson(str, Student.class);
mJsonTxt.setText(student.toString());
}
});
}
}
Gson解析JSON數(shù)組(介紹都在代碼注釋中)
JSON數(shù)據(jù)
[
{
"id": 1,
"name": "Amy",
"age": 20
},
{
"id": 2,
"name": "Tom",
"age": 10
}
]
移動端
- People
public class People {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "People{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
- MainActivity
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private TextView mJsonTxt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
Button gsonArrayBtn = findViewById(R.id.gsonArray_btn);
gsonArrayBtn.setOnClickListener(this);
mJsonTxt = findViewById(R.id.json_txt);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.gsonArray_btn:
new Thread(new Runnable() {
@Override
public void run() {
paraseJSONWithGSONArray(NetWorkUtils.sendUrlGetString("http://XXX:8080/JsonTwo", "GET"));
}
}).start();
break;
}
}
private void paraseJSONWithGSONArray(final String s) {
runOnUiThread(new Runnable() {
@Override
public void run() {
// 創(chuàng)建Gson對象
Gson gson = new Gson();
// 如果解析一段JSON數(shù)組會稍微麻煩點。我們需要借助TypeToken將期望解析成的數(shù)據(jù)類型傳入到fromJson方法中。
List<People> peopleList = gson.fromJson(s, new TypeToken<List<People>>() {
}.getType());
for (People people : peopleList) {
mJsonTxt.setText("id = " + people.getId() + "\n" + "name = " + people.getName() + "\n" + "age = " + people.getAge());
}
}
});
}
}
總結(jié)
當(dāng)然本篇文章中都是一些簡單的JSON數(shù)據(jù)格式,適合入門學(xué)習(xí),當(dāng)然在實際開發(fā)中會很復(fù)雜的JSON數(shù)據(jù)格式,到時候大家見招拆招,不要死記解析步驟。