JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,是一种轻量级的数据交换格式。JSON 提供了多种语言之间完成数据交换的能力,是一种理想的数据交换格式。
JSON 主要有如下两种数据结构:
(1)、有 key-value 对组成的数据结构。
(2)、有序集合。
下面介绍 JSON 的解析方式:
------> 一般的解析;
------> 使用谷歌的 Gson 解析
------> 使用阿里巴巴的 fastJSON 解析(同 Gson 差不多,不介绍)
------> 从网络上解析
在 assets 目录下,新建一个 test.json;
{
"person": {
"name": "张三",
"age": 25,
"children": [
{
"name": "李四",
"age":3
},
{
"name": "王五",
"age": 3
},
{
"name": "小黑",
"age": 1
}
]
}
}
(1)、一般的解析:
先从 assets 目录下读取文件:
/**
* 读取 Assets 文件夹下的 test.json
*/
private String readFromAssets() {
InputStream is = null;
BufferedReader br = null;
try {
is = getAssets().open("test.json");
br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder("");
String str = null;
while ((str = br.readLine()) != null) {
sb.append(str);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null && is != null){
try {
br.close();
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
解析从 test.json 中读取的字符串:
/**
* 普通解析
*/
private void jieXiJson(String str){
try {
JSONObject jsonObject = new JSONObject(str);
JSONObject person = jsonObject.getJSONObject("person");
String name = person.getString("name");
Integer age = person.getInt("age");
int chiSum = person.getJSONArray("children").length();
Log.d("JSON解析", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个");
JSONArray children = person.getJSONArray("children");
for (int i = 0; i < chiSum; i++) {
String jChiName = children.getJSONObject(i).getString("name");
int jChiAge = children.getJSONObject(i).getInt("age");
Log.d("=========","name: " + jChiName + ", 年龄: " + jChiAge);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
结果如下:
(2)、使用 Gson 解析:
先下载 Gson ,如下:
使用 Gson 解析需要把 JSON 转换为对象(每个 key 都要有相应的对象),要新建几个类:
------> 从 JSON 结构可以看出有 3 个孩子(李四,王五,小黑),3 个孩子都有名字和年龄。所以创建 ChildrenT 类:
ChildrenT.java :
package com.crazy.forjson;
/**
* Created by antimage on 2016/1/3.
*/
public class ChildrenT {
private String name;
private int age;
public ChildrenT(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
package com.crazy.forjson;
import java.util.List;
/**
* Created by antimage on 2016/1/3.
*/
public class Person {
private List<ChildrenT> children;
private String name;
private int age;
public List<ChildrenT> getChildren() {
return children;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setChildren(List<ChildrenT> children) {
this.children = children;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
现在只有 person ( key ) 没有解析了,所以新建一个有对象 person 的类,PersonT:
package com.crazy.forjson;
/**
* Created by antimage on 2016/1/3.
*/
public class PersonT {
private Person person;
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
所需的类创建好后就可以使用 Gson 解析了(使用 fastJSON 都需要创建这几个类):
/**
* 用谷歌的 Gson 解析
*/
private void forGson(String str){
Gson gson = new Gson();
PersonT personT = gson.fromJson(str, PersonT.class);
// ======================= person ======================
Person person = personT.getPerson();
String name = person.getName();
int age = person.getAge();
int chiSum = person.getChildren().size();
Log.d("person", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个");
// ======================= children ====================
List<ChildrenT> chiList = person.getChildren();
for (ChildrenT children : chiList) {
String chiName = children.getName();
int chiAge = children.getAge();
Log.d("children", "姓名:" + chiName + ", 年龄:" + chiAge );
}
}
(3)、从网络中解析 JSON:
从网络读取信息,首先加上相应的权限:
<uses-permission android:name="android.permission.INTERNET" />
网上的资源如下:
根据图片的信息,新建几个类(和前文的创建方法一样):
先创建类 UserT :
package com.crazy.forjson.fromnet;
/**
* Created by scxh on 2016/1/4.
*/
public class UserT {
private String id;
private String userName;
private String password;
private String email;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
package com.crazy.forjson.fromnet;
/**
* Created by scxh on 2016/1/4.
*/
public class UserFromNet {
private UserT user;
private String message;
public UserT getUser() {
return user;
}
public void setUser(UserT user) {
this.user = user;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
使用异步下载:
/**
* 从网络读取信息
*/
private class DownloadTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String str = params[0];
HttpURLConnection conn = null;
BufferedReader br = null;
try {
URL url = new URL(str);
conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
conn.setDoInput(true);
conn.setConnectTimeout(5000);
conn.connect();
if(conn.getResponseCode() == 200){
InputStream is = conn.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder("");
String str1 = null;
while ((str1 = br.readLine()) != null) {
sb.append(str1);
}
return sb.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null && conn != null) {
try {
br.close();
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
@Override
protected void onPostExecute(String forNet) {
jieXiFromNet(forNet);
}
}
其中的方法 jieXiFromNet(String forNet):
/**
* 解析从网络读取的字符串 json
*/
private void jieXiFromNet(String forNet) {
Gson gson = new Gson();
UserFromNet ufn = gson.fromJson(forNet, UserFromNet.class);
String message = ufn.getMessage();
Log.d("User 的 信息", "信息: " + message);
//=======================
UserT ut = ufn.getUser();
String id = ut.getId();
String userName = ut.getUserName();
String password = ut.getPassword();
String email =ut.getEmail();
Log.d("User 的详细信息", "证件号:" + id + ", 姓名:" + userName
+ ", 密码:" + password + ", 邮箱" + email);
}
结果如下: