android轉jsonobject
⑴ android 怎麼看json數據格式
給服務端發送請求後,服務端會返回一連串的數據,這些數據在大部分情況下都是XML格式或者JSON格式。然後JSON相對XML來說解析相對方便一些,所以先說說JSON的解析。
JSON的基本數據格式有這幾種:
1.一個JSON對象——JSONObject
{"name":"胡小威" , "age":20 , "male":true}
2.一個JSON數組——JSONArray
[{"name":"胡小威" , "age":20 , "male":true},{"name":"趙小亮" , "age":22 , "male":false}]
3.復雜一點的JSONObject
{"name":"胡小威", "age"=20, "male":true, "address":{"street":"嶽麓山南", "city":"長沙","country":"中國"}}
4.復雜一點的JSONArray
[
{"name":"胡小威", "age"=20, "male":true, "address":{"street":"嶽麓山南", "city":"長沙","country":"中國"}},
{"name":"趙小亮", "age"=22, "male":false, "address":{"street":"九州港", "city":"珠海","country":"中國"}}
]
5.來個更復雜的,這是我從愛幫公交上扒取的數據
{"buses":{"bus":[{"last_foot_dist":"0","time":"37","segments":{"segment":[{"line_name":"立珊專線(中南大學學生公寓-長沙火車站)","foot_dist":"362","stat_xys":"","stats":"嶽麓山南;湖南師大;二里半;嶽麓山北;市四醫院;華圖教育(太平街口);牛耳教育(南陽街口);韭菜園;曙光路口;長島路口;長沙火車站","end_stat":"長沙火車站","line_xys":"","line_dist":"7535","start_stat":"嶽麓山南"}]},"foot_dist":"362","dist":"7897"},{"last_foot_dist":"0","time":"41","segments":{"segment":[{"line_name":"旅1路(科教新村-長沙火車站)","foot_dist":"337","stat_xys":"","stats":"嶽麓山南;湖南師大;二里半;嶽麓山北;市四醫院;華圖教育(太平街口);蔡鍔中路口;韭菜園;喬庄;曙光路口;長島路口;五一東村;車站路口;長沙火車站","end_stat":"長沙火車站","line_xys":"","line_dist":"7822","start_stat":"嶽麓山南"}]},"foot_dist":"337","dist":"8159"}]}}
接下來是解析部分
一、直接解析
1.{"name":"胡小威" , "age":20 , "male":true}
java代碼
public void parseJsonObject(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
//接下來該幹嘛幹嘛
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.[{"name":"胡小威" , "age":20 , "male":true},{"name":"趙小亮" , "age":22 , "male":false}]
Java代碼
public void parseJSONArray(String json) {
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
//接下來該幹嘛幹嘛
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
3.{"name":"胡小威", "age"=20, "male":true, "address":{"street":"嶽麓山南", "city":"長沙","country":"中國"}}
Java代碼
public void parseJsonPerson(String json) {
try {
JSONObject jsonObject = new JSONObject(json);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
JSONObject addressJSON = jsonObject.getJSONObject("address");
String street = addressJSON.getString("street");
String city = addressJSON.getString("city");
String country = addressJSON.getString("country");
Address address = new Address(street, city, country);
Person person = new Person(name, age, male, address);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
4.
[
{"name":"胡小威", "age"=20, "male":true, "address":{"street":"嶽麓山南", "city":"長沙","country":"中國"}},
{"name":"趙小亮", "age"=22, "male":false, "address":{"street":"九州港", "city":"珠海","country":"中國"}}
]
Java代碼
public void parseJsonArrayPerson(String json) {
List<Person> persons = new ArrayList<Person>();
try {
jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
JSONObject addressJSON = jsonObject.getJSONObject("address");
String street = addressJSON.getString("street");
String city = addressJSON.getString("city");
String country = addressJSON.getString("country");
Address address = new Address(street, city, country);
Person person = new Person(name, age, male, address);
persons.add(person);
Log.v("juno", person.toString());
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v("juno", persons.toString());
}
5. {"buses":{"bus":[{"last_foot_dist":"0","time":"37","segments":{"segment":[{"line_name":"立珊專線(中南大學學生公寓-長沙火車站)","foot_dist":"362","stat_xys":"","stats":"嶽麓山南;湖南師大;二里半;嶽麓山北;市四醫院;華圖教育(太平街口);牛耳教育(南陽街口);韭菜園;曙光路口;長島路口;長沙火車站","end_stat":"長沙火車站","line_xys":"","line_dist":"7535","start_stat":"嶽麓山南"}]},"foot_dist":"362","dist":"7897"},{"last_foot_dist":"0","time":"41","segments":{"segment":[{"line_name":"旅1路(科教新村-長沙火車站)","foot_dist":"337","stat_xys":"","stats":"嶽麓山南;湖南師大;二里半;嶽麓山北;市四醫院;華圖教育(太平街口);蔡鍔中路口;韭菜園;喬庄;曙光路口;長島路口;五一東村;車站路口;長沙火車站","end_stat":"長沙火車站","line_xys":"","line_dist":"7822","start_stat":"嶽麓山南"}]},"foot_dist":"337","dist":"8159"}]}}
Java代碼
public List<Salution> parseJSON(String str){
Log.d("返回的JSON數據:", str);
List<Salution> busList = new ArrayList<Salution>();
try {
JSONObject jsonObject = new JSONObject(str);
JSONObject busesJSON = jsonObject.getJSONObject("buses");
JSONArray busJSArray=busesJSON.getJSONArray("bus");
for(int i=0;i<busJSArray.length();i++){
JSONObject busJSObject = busJSArray.getJSONObject(i);
JSONObject segsJSObject=busJSObject.getJSONObject("segments");
JSONArray segJSArray=segsJSObject.getJSONArray("segment");
Salution st=new Salution();
for(int j=0;j<segJSArray.length();j++){
if(j==0){
JSONObject segJSObject = segJSArray.getJSONObject(j);
st.setLine_name1(segJSObject.getString("line_name"));
Log.d("line_name", segJSObject.getString("line_name"));
st.setStats1(segJSObject.getString("stats"));
st.setEnd_stat1(segJSObject.getString("end_stat"));
st.setStart_stat1(segJSObject.getString("start_stat"));
}
if(j==1){
JSONObject segJSObject = segJSArray.getJSONObject(j);
st.setLine_name2(segJSObject.getString("line_name"));
Log.d("line_name", segJSObject.getString("line_name"));
st.setStats2(segJSObject.getString("stats"));
st.setEnd_stat2(segJSObject.getString("end_stat"));
st.setStart_stat2(segJSObject.getString("start_stat"));
}
}
busList.add(st);
}
return busList;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
這里我只是簡單獲取了幾個我想要的數據。
二、使用JSON類庫Gson 來解析JSON
Gson 是 Google 提供的用來在 Java 對象和 JSON 數據之間進行映射的 Java 類庫。可以將一個 JSON 字元串轉成一個 Java 對象,或者反過來。
首先,從 code.google.com/p/google-gson/downloads/list下載GsonAPI
Java代碼
google-gson-1.7.1-release.zip
再把gson-1.7.jar 到libs
可以使用兩種方法解析
①、通過獲取JsonReader對象解析JSON數據:
Java代碼
String jsonData = "[{\"username\":\"arthinking\",\"userId\":001},{\"username\":\"Jason\",\"userId\":002}]";
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("username")){
System.out.println(reader.nextString());
}
else if(tagName.equals("userId")){
System.out.println(reader.nextString());
}
}
reader.endObject();
}
reader.endArray();
}
catch(Exception e){
e.printStackTrace();
}
②、通過把JSON數據映射成一個對象,使用Gson對象的fromJson()方法獲取一個對象數組進行操作
Java代碼
Type listType = new TypeToken<LinkedList<User>>(){}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(jsonData, listType);
for (Iterator iterator = users.iterator(); iterator.hasNext();) {
User user = (User) iterator.next();
System.out.println(user.getUsername());
System.out.println(user.getUserId());
}
我一般是採用直接解析,添加類庫神馬的最討厭了···
還有,抱怨一下,iteye的編輯弱爆了!!!
轉載
⑵ net.sf.json.JSONObject與Android自帶的JSON解析類沖突怎麼辦
在Android中,由於類名相同,可能造成沖突,解決方案:
盡量使用同一個庫下的JSON解析工具。
如果類型相同,但是包名不同,建議使用完整的包名+類名定義變數,例如java中,java.sql.Date和java.uitl.Date兩個都是Date類,但是怎麼區分呢,就可以通過包名+類名來區分:
java.sql.Date date1 = new java.sql.Date();
java uitl.Date date2 = new java.uitl.Date();
JSONObject也一樣,可以使用這種方式。
Android中,json的解析,建議使用google提供的Gson這個開源庫,json的解析或者對象與json轉換,只需要一行代碼。
Gson gson = new Gson();
gson.toJson(object); gson.fromJson(json.Object.class);
⑶ android 使用JSONObject 數組報錯, NullPointerException
錯誤是指MainActivity的第85行,你看下你代碼,如果解析出來的一個類為空,這個類在使用的時候就會報空指針,你加個非空判斷。
另外,你用的是eclipse么,如果是Android studio的話,你引入個gson或者fastjson依賴,一句話就解析完成了;還有個插件,GsonFormat,直接把JSON完整的粘貼到裡面,自動生成實體類