Android解析Json數據
在執行解析數據之前,需要將一個類庫應用到你的程序中,下載的地址是:
http://code.google.com/p/google-gson/
下載解壓之后你需要將藍色標記的文件放入到你的程序之中應用
首先,我們需要知道什么是Json數據:
JSON的定義:
一種輕量級的數據交換格式,具有良好的可讀和便于快速編寫的特性。業內主流技術為其提供了完整的解決方案(有點類似于正則表達式 ,獲得了當今大部分語言的支持),從而可以在不同平臺間進行數據交換。JSON采用兼容性很高的文本格式,同時也具備類似于C語言體系的行為。 – Json.org
說到這里,可能會發現Json數據與XML文件很相似,下面,我們看下它們之間的對比:
1.JSON和XML的數據可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對于XML來講,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差
6.JSON的速度要遠遠快于XML
下面,我們看下Android官方文檔給出的一個Json的例子:
[ { "id": 912345678901, "text": "How do I read JSON on Android?", "geo": null, "user": { "name": "android_newb", "followers_count": 41 }, { "id": 912345678902, "text": "@android_newb just use android.util.JsonReader!", "geo": [50.454722, -104.606667], "user": { "name": "jesse", "followers_count": 2 } } ]}
這是一個Json數組,里面有兩個對象,我們需要對其進行解析,下面的鏈接是官方文檔對其解析的例子:
下面,以一個具體的例子對其進行說明:
在這個例子中介紹三種解析Json的方法,其中第二和第三類是利用類對象和Json數據的互相轉換完成的解析。
下面是實現的截圖:
第一個按鈕的作用是利用Google提供的Api解析Json數據,這里給出的是一個數組,具體的實現代碼如下:
public class JsonUtils { public void parseJson(String jsonData) { try { //創建JsonReader 對象 JsonReader reader = new JsonReader(new StringReader(jsonData)); //開始解析數組 reader.beginArray(); //循環判斷有沒有下一個Json對象 while(reader.hasNext()){ //開始解析Json對象 reader.beginObject(); //循環判斷Json對象里面有沒有下一個鍵值對 while(reader.hasNext()){ String tagName = reader.nextName(); if(tagName.equals("name")){ //name鍵多對應的值 Log.d("BruceZhang", "name: "+reader.nextString()); }else if(tagName.equals("age")){ //age鍵多對應的值 Log.d("BruceZhang", "age: "+reader.nextString()); } } //Json對象的結尾 reader.endObject(); } //數組解析的結尾 reader.endArray(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } }
在主程序的調用如下:
private void jsonArray(String jsonData) { JsonUtils jsonUtils=new JsonUtils(); jsonUtils.parseJson(jsonData); }
第二個按鈕是利用類對象向Json數據的轉換進行的解析,下面是實現的代碼:
public class JsonUtils2 { public void parseUserFromJson(String jsonData){ Gson gson=new Gson(); //把Json對象轉換成User對象 User user=gson.fromJson(jsonData, User.class); Log.d("BruceZhang", "name:"+user.getName()); Log.d("BruceZhang", "name:"+user.getAge()); } }
在主程序的調用如下:
private void userJson(String jsonData){ JsonUtils2 jsonUtils=new JsonUtils2(); jsonUtils.parseUserFromJson(jsonData); }
第三個按鈕同第二個按鈕的原理是一樣的,不過這里解析的Json數組,代碼如下:
public class JsonUtils3 { public void parseUserFromJson(String jsonData){ // Type listType=(Type) new TypeToken<LinkedList<User>>(){}.getType(); // Gson gson=new Gson(); // LinkedList<User> users=gson.fromJson(jsonData, (java.lang.reflect.Type) listType); // for(Iterator<User> iterator=users.iterator();iterator.hasNext();){ // User user=(User)iterator.next(); // Log.d("BruceZhang", "name: "+user.getName()); // Log.d("BruceZhang", "name: "+user.getAge()); // } Type listType = new TypeToken<LinkedList<User>>(){}.getType(); Gson gson = new Gson(); //LinkList是雙向鏈表 LinkedList<User> users = gson.fromJson(jsonData, listType); for (Iterator<User> iterator = users.iterator(); iterator.hasNext();) { User user = (User) iterator.next(); // System.out.println(user.getName()); // System.out.println(user.getAge()); Log.d("BruceZhang", "name: "+user.getName()); Log.d("BruceZhang", "name: "+user.getAge()); } } }
在主程序的調用如下:
private void userJsonArray(String jsonData){ JsonUtils3 jsonUtils=new JsonUtils3(); jsonUtils.parseUserFromJson(jsonData); }
下面給出主程序的完整代碼:
public class MainActivity extends Activity { /* * 1.開始解析數組 * 2.開始解析對象 * 3.解析鍵值對(多個) * 4.解析對象結束 * 5.開始解析對象 * 6.解析鍵值對 * 7.解析對象結束 * 8.解析數組結束 */ private String jsonData="[{\"name\":\"BruceZhang\",\"age\":20},{\"name\":\"ZhangHu\",\"age\":23}]"; private String jsonData2="{\"name\":\"BruceZhang\",\"age\":20}"; private Button button; private Button button2; private Button button3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button=(Button)findViewById(R.id.button); button.setOnClickListener(new MyButton()); button2=(Button)findViewById(R.id.button2); button2.setOnClickListener(new MyButton()); button3=(Button)findViewById(R.id.button3); button3.setOnClickListener(new MyButton()); } class MyButton implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub switch (v.getId()) { case R.id.button: jsonArray(jsonData); break; case R.id.button2: userJson(jsonData2); break; case R.id.button3: userJsonArray(jsonData); break; default: break; } } } private void jsonArray(String jsonData) { JsonUtils jsonUtils=new JsonUtils(); jsonUtils.parseJson(jsonData); } private void userJson(String jsonData){ JsonUtils2 jsonUtils=new JsonUtils2(); jsonUtils.parseUserFromJson(jsonData); } private void userJsonArray(String jsonData){ JsonUtils3 jsonUtils=new JsonUtils3(); jsonUtils.parseUserFromJson(jsonData); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!