Android開發過程中,數據傳輸是難免的,一般組織數據有兩種方式:xml格式和json格式。兩者解析都非常方便,而且解析工具也都很多,這裡不多作比較。
下面就Json格式的解析做一個比較實用的分析:
1) 解析Json格式的數據
2) 解析單個對象
3) 解析對象的集合
一 大前提–什麼是Json ?
1.如果不知道什麼是Json,先掃一下盲
1)JSON:JavaScript Object Notation
2) JSON數據是一系列鍵值對的集合
3)官方網址:www.json.org, 去看看就什麼都明白瞭
2.Json vs xml
1) JSON和XML可讀性基本相同
2)JSON和XML通用擁有豐富的解析手段
3)JSON相對XML來講體積更小
4)JSON與JavaScript的交互性更加方便
5) JSON對數據的描述性相對較差
二 Android 中的JSON解析工具
1.從API level 11 開始(也就是Android3.0),在android.util包下就有瞭JsonReader 和 JsonWriter兩個幫助類,供我們來解析和使用json。
2.Android3.0以下系統的最佳的做法是使用Google的gson類庫來解析,其實這也是3.0以後的做法,隻是集成瞭進來,
下載地址:http://code.google.com/p/google-gson/downloads/list
3.下載後的jar文件導入到項目中,我相信這大傢都會,下面的例子我采用的是gson來解析。
三 JSON實戰
1. 解析json格式的數據
比如說有一個User對象,他有兩個屬性:name和age,當然實際情況可能有更多的屬性,
那麼用json格式表示就是:{name:"Ian", age: "20"},我相信你懂的。
1)自定義JSON幫助類–JsonUtils
Java代碼
public class JsonUtils {
public void parseJson(String jsonData) {
try {
JsonReader reader = new JsonReader(new StringReader(jsonData));
reader.beginArray();
while (reader.hasNext()) {
reader.beginObject();
while(reader.hasNext()) {
String tagName = reader.nextName();
if(tagName.equals("name")) {
System.out.println("name—>" + reader.nextString());
} else if(tagName.equals("age")) {
System.out.println("age—>" + reader.nextString());
}
}
reader.endObject();
}
reader.endArray();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2) Activity代碼
Java代碼
public class MainActivity extends Activity {
private Button btnStart;
private String jsonDataUser = "{\"name\":\"Ian\",\"age\":20}";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button)findViewById(R.id.btnStart);
btnStart.setOnClickListener(new BtnStartSetOnClickListener());
}
private class BtnStartSetOnClickListener implements OnClickListener {
@Override
public void onClick(View v) {
JsonUtils jsonUtils = new JsonUtils();
jsonUtils.parseJson(jsonData);
}
}
}
就這麼幾行代碼,在Console上就可以看到解析輸出的信息瞭,是不是很簡單呢?
2. 解析對象
1)上面解析的是字符串形式,如果我們定義一個User對象會怎麼樣呢?
Java代碼
public class User {
private String name;
private int age;
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;
}
}
2) 解析方法
Java代碼
public void parseUserFromJson(String jsonData) {
Gson gson =new Gson();
User user = gson.fromJson(jsonData, User.class);
System.out.println("name———->" + user.getName());
System.out.println("age———->" + user.getAge());
}
是不是更簡單瞭呢?
3. 解析集合
1)如果不是單個User,而是ArrayList<User>,那麼該怎麼解析啊,因為這個太常見瞭。
要解決這個問題,得先弄明白集合用json該怎麼表示,簡單來講“{}”表示一個對象,“[]”表示一個集合,集合裡面可以有多個對象,這樣表示[{},{},{}]。OK,那麼看實戰代碼,
json數據:
Java代碼
private String jsonDataUsers = "[{\"name\":\"Jack\",\"age\":20},{\"name\":\"Tom\",\"age\":22},{\"name\":\"Ian\",\"age\":20}]";
解析代碼:
Java代碼
public void parseUserFromJson(String jsonData) {
Type typeList = new TypeToken<ArrayList<User>>(){}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, typeList);
for(Iterator<User> iterator = users.iterator(); iterator.hasNext();) {
User user = iterator.next();
System.out.println("name———->" + user.getName());
System.out.println("age———->" + user.getAge());
}
}
我們可以看到,隻是多瞭一行“Type typeList = new TypeToken<ArrayList<User>>(){}.getType();”,就可以解析出List來,然後迭代List就可以得到整個數據
瞭,真的很方便,還等什麼呢,趕快試試看吧!