Android解析Json數據

jopen 11年前發布 | 49K 次閱讀 Android Android開發 移動開發

在執行解析數據之前,需要將一個類庫應用到你的程序中,下載的地址是:

http://code.google.com/p/google-gson/ 

下載解壓之后你需要將藍色標記的文件放入到你的程序之中應用Android解析Json數據

首先,我們需要知道什么是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數據的互相轉換完成的解析。

下面是實現的截圖:

Android解析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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!