Android JSON数据的解析与封装小Demo
转自:http://www.open-open.com/lib/view/open1420529336406.html
packagecom.example.jsondemo;
importorg.json.JSONArray;
importorg.json.JSONException;
importorg.json.JSONObject;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassMainextendsActivity{
//privatestaticfinalStringBASE_URL=
//"http://zhoumushui.sinaapp.com/json/";
privateTextViewtvMsg;
privateTextViewtvJson;
privateEditTextetName;
privateEditTextetAge;
privateStringstrJson="";
privateStringstaffInfo="";
privateStringstrJsonRes="";
privateStringstrMsg;
privateButtonbtnAdd;
privateButtonbtnJson;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tvMsg=(TextView)findViewById(R.id.tvMsg);
tvJson=(TextView)findViewById(R.id.tvJson);
etName=(EditText)findViewById(R.id.etName);
etAge=(EditText)findViewById(R.id.etAge);
btnAdd=(Button)findViewById(R.id.btnAdd);
btnJson=(Button)findViewById(R.id.btnJson);
MsgToJson();//封装Json
JsonToMsg();//解析Json
}
classonClickListenerImpimplementsOnClickListener{
@Override
publicvoidonClick(Viewv){
//TODOAuto-generatedmethodstub
if(v==btnAdd){
if(strMsg!=null&&strJson.trim().length()!=0){
strMsg=strMsg+",{name:'"+etName.getText().toString()
+"',age:"+etAge.getText().toString()+"}";
}else{
strMsg="{staff:[{name:'"+etName.getText().toString()
+"',age:"+etAge.getText().toString()+"}";
}
Toast.makeText(Main.this,"AddSucccess!",Toast.LENGTH_SHORT)
.show();
etAge.setText("");
etName.setText("");
}elseif(v==btnJson){
strJsonRes="";
strJsonRes=strMsg+"]}";
tvJson.setText(strJsonRes);
}
}
}
privatevoidMsgToJson(){
btnAdd.setOnClickListener(newonClickListenerImp());
btnJson.setOnClickListener(newonClickListenerImp());
}
privatevoidJsonToMsg(){
strJson="{staff:[{name:'Alex',age:21},{name:'Zhou',age:22},{name:'Anne',age:23}],company:'T-Chip'}";
staffInfo="原始数据:\n"+strJson+"\n\n解析之后:\n";
try{
JSONObjectmJsonObject=newJSONObject(strJson);
JSONArraymJsonArray=mJsonObject.getJSONArray("staff");
Stringcompany=mJsonObject.getString("company");
staffInfo=staffInfo+company+"共有"+mJsonArray.length()
+"个员工,信息如下:\n";
for(intstaffCount=0;staffCount<mJsonArray.length();staffCount++){
//获取员工
JSONObjectstaff=mJsonArray.getJSONObject(staffCount);
intstaffNo=staffCount+1;
staffInfo=staffInfo+"序号:"+staffNo+"姓名:"
+staff.getString("name")+"年龄:"
+staff.getInt("age")+"\n";
}
tvMsg.setText(staffInfo);
}catch(JSONExceptione){
e.printStackTrace();
}catch(Exceptione){
e.printStackTrace();
}
}
}
布局有点拖沓,其实数据封装部分还可以利用一下解析部分的逻辑。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tvMsg"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="=========================="/>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/etName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="姓名"/>
<EditText
android:id="@+id/etAge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="年龄"/>
<Button
android:id="@+id/btnAdd"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="增加"/>
<Button
android:id="@+id/btnJson"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="JSON"/>
</LinearLayout>
<TextView
android:id="@+id/tvJson"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>