Android下JSON解析的方式

Android下的JSON解析有很多的方法,今天學習其中的兩種,第一種是輕量級,也就是數據量比較容易解析的,第二種是重量級一點的,也就是數據量比較多,而且解析比較複雜的。
在學習這兩種方法之前,首先先學習如何生成JsonObject對象
生成Json數據的完整代碼如下:

package com.yupeibiao.jsondeom;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
    private Button mButton;
    private Intent mIntent;
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
         writeMessage(createJsonObject());
         intiViews();
         initEvents();
    }  
    public void initEvents(){
        mButton.setOnClickListener(this);
    }
    public void intiViews(){
        mButton=new Button(this);

    }
    public  void  writeMessage(JSONObject message){
        String filePath=Environment.getExternalStorageDirectory() + File.separator + "linmeini&yupeibiao"  
                + File.separator + "love.txt";
        File file=new File(filePath);
        //如果文件目錄不存在,就創建目錄
        if(!file.exists()){
            file.getParentFile().mkdirs();  
        }
        BufferedWriter bw=null;
        try {
        bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
        bw.write(message.toString());
        Toast.makeText(MainActivity.this,"文件寫入完畢",Toast.LENGTH_SHORT);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(bw!=null){
                try {
                    bw.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * JSON對象記錄信息
     * @return
     */
    public JSONObject  createJsonObject(){
        JSONObject message=new JSONObject();
        try{
        JSONArray telephone=new JSONArray();
        //先寫入名字
        message.put("name","yupeibiao&linmeini");
        //同過JSONArray可以存儲更多的細節信息  將信息用對象封裝起來
        telephone.put("188****9764");
        telephone.put("155****4715");
        message.put("電話", telephone);
        //寫入時長
        JSONArray loveTime=new JSONArray();
        loveTime.put("2014年9月10日---------------------2015年8月20日");
        message.put("時長", loveTime);
        }catch(Exception e){
            Toast.makeText(this, "讀取失敗", Toast.LENGTH_SHORT).toString();
        }
        return message;

    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button1:
            mIntent=new Intent(MainActivity.this,JSONParseDeomActivity.class);
            startActivity(mIntent);
            break;

        default:
            break;
        }

    }


}  

從上面我們可以總結,JsonObject實際上是以key value的方式進行存放的,其中的key是String類的,而value可以是boolean,int,String,甚至是JsonObject對象。
通過不停的put的方式的方式生成Json數據。
接下來是解析Json數據。
第一種,是JsonReader,從Aandroid 3.0之後便開始增加進去的解析方式。
過程:第一步:得到JsonReader對象
第二步:開始解析Array,解析數組
第三步:解析數組中的對象
第四步:結束解析
完整代碼貼出如下:
JSONParseDeomActivity

package com.example.jsondeom;

import java.io.StringReader;

import android.app.Activity;
import android.os.Bundle;
import android.util.JsonReader;

public class JSONParseDeomActivity extends Activity {
    private static final String JSONString = "[{\"name\":\"yupeibiao\",\"age\":21},{\"lindear\":\"Mike\",\"age\":19}]";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_2);
        JSONReaderUtils.parseJSON(JSONString);
    }
}

接下來是工具類 JSONReaderUtils

package com.example.jsondeom;

import java.io.IOException;
import java.io.StringReader;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.util.JsonReader;

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@SuppressLint("NewApi")
public class JSONReaderUtils {
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    @SuppressLint("NewApi")
    public static void parseJSON(String data) {
        //得到JsonReader對象
        JsonReader reader = new JsonReader(new StringReader(data));
        // 開始解析
        try {
            //先開始讀數組
            reader.beginArray();
            while (reader.hasNext()) {
                //讀對象
               reader.beginObject();
               while(reader.hasNext()){
                   String key=reader.nextName();
                   if(key.equals("name")){
                       System.out.println("name------------------------"+reader.nextString());
                   }else if(key.equals("age")){
                       System.out.println("age------------------------"+reader.nextInt());
                   }else{
                       System.out.println("JsonReader  解析完畢");
                   }
               }
               //解析Object完畢
               reader.endObject();
            }
            reader.endArray();
        } catch (IOException e) {

            e.printStackTrace();
        }

    }
}

從網絡上他人的博客得到的解析的步驟是:

先分析一下這個JSON字符串的結構:一個JSONArray裏面有兩個JSONObject
再分析一下JsonReader解析這個JSON字符串的流程:
遇到【[】,開始解析數組(reader.beginArray())
遇到【{】,開始解析對象(reader.beginObject())
遇到【"】,開始解析第一個鍵值對
遇到【"】,開始解析第二個鍵值對
遇到【}】,結束解析對象(reader.endObject())
遇到【{】,開始解析對象(reader.beginObject())
遇到【"】,開始解析第一個鍵值對
遇到【"】,開始解析第二個鍵值對
遇到【}】,結束解析對象(reader.endObject())
遇到【]】,結束解析數組(reader.endArray())

第二種:Gosn解析
對於比較複雜的數據使用Gosn解析會比較方便,其實主要是將需要解析的數據進行類封裝,然後使用對應的class字節碼文件自動完成解析的方式。
第二種方式參考http://blog.csdn.net/tkwxty/article/details/34474501 寫的不錯,收藏學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章