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 寫的不錯,收藏學習。