对于移动开发得人来说,网络编程中的关系就是客户端和服务器端的关系,这里我们用一个幽默通俗的比喻来解释一下:假如男生向女生发出约会的请求,(一般来说应该男生要主动的~~),在这里我们就可以把男生当成客户端,女生就是服务器端,客户端向服务器端发送请求;
假如女生同意了,那么就会回复男生,那女生可以用好多种方式回复,有可能是短信,QQ或者微信等;在这里就相当于服务器端响应客户端,客户端请求成功(客户端应该很开心~~),服务器端就会返回数据,返回数据的格式有好多种,就像女生回复的方式一样,有多种方式,一般有XML格式,以及我们即将重点介绍的Json数据格式,因为现在市场大部分是采用返回Json数据的形式,而这里我们用两种解析方式:Json解析和Gson解析。
一:Json解析
这种解析数据的方式是目前使用最多的一种,但是它的缺点就是如果返回的Json数据复杂的话,解析起来就比较麻烦,但是它的好处就是可以只在复杂的json数据中解析出自己觉得有用的数据段就行,不需要全部解析出来。在这里我们来写个简单的例子来说明Json解析的用法:
public class MainActivity extends Activity {
public static final String JSONDATA = "{name:张三,age:26,"
+ "phone:[131,132],score:{语文:100,数学:60,理综:{化学:120,物理:150}}}";
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (TextView) findViewById(R.id.show);
}
public void btn1(View view) {
try {
///StringBuffer在这里是用其append()方法来拼接数据的作用
StringBuffer stringBuffer = new StringBuffer();
// JSONObject jsonObject = new JSONObject(JSONDATA);
///可以将上面的这行代码换成下面这两行代码来实现
JSONTokener jsonToken=new JSONTokener(JSONDATA);
JSONObject jsonObject=(JSONObject) jsonToken.nextValue();
stringBuffer.append("name:" + jsonObject.getString("name") + "\n");
stringBuffer.append("age:" + jsonObject.getString("age") + "\n");
JSONArray phoneArray = jsonObject.getJSONArray("phone");
stringBuffer.append("phone:" + phoneArray.getString(0) + " " + phoneArray.getString(1) + "\n");
JSONObject scoreObject = jsonObject.getJSONObject("score");
stringBuffer.append("语文:" + scoreObject.getString("语文") + "\n");
stringBuffer.append("数学:" + scoreObject.getString("数学") + "\n");
JSONObject LIZObject = scoreObject.getJSONObject("理综");
stringBuffer.append("化学:" + LIZObject.getString("化学") + "\n");
stringBuffer.append("物理:" + LIZObject.getString("物理") + "\n");
show.setText(stringBuffer.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
}
说明:在这里代码中的JSONDATA是博主自己编写的一个简单的Json数据格式,在这里遇到“{}”就代表是一个JsonObject类型, “[ ]”就是代表一个JsonArray类型,所以明白这个,我们首先从左往右看JSONDATA这个Json数据,刚开始遇到“{name:,这就代表这是整个是一个JsonObject数据,所以先 JSONObject jsonObject = new JSONObject(JSONDATA)来讲JSONDATA来包装成一个JsonObject,当然在这里我在上面注释也写了,可以用这两行代码代替这句代码把JSONDATA包装起来:
JSONTokener jsonToken=new JSONTokener(JSONDATA);
JSONObject jsonObject=(JSONObject) jsonToken.nextValue();
接着,我们用jsonObject .getString(“name”)就可以获得JSONDATA数据中name的值,age也是类似的;
接着我们遇到了“phone:[131,132]“,这里我们看到了”[ ]”,说明这个phone是一个JsonArray类型,所以我们用JSONArray phoneArray = jsonObject.getJSONArray(“phone”)来获得到这个JsonArray,然后再用phoneArray.getString(0)以及phoneArray.getString(1)来获取到131和132这两个值,接下来的score和理综都是JsonObject,所以在这就不继续写了,处理和前面的是类似,可以结合代码分析清楚。
在这里,假如我们不需要获取age字段的值,那么我们可以不写jsonObject.getString(“age”)来获取值就行,这就是所谓的只解析自己有用的数据段。
结果运行图:
二:Gson解析
Gson其实是谷歌推出来的Json,所以简称Gson,首先Gson解析的优点就是不用我们像Json解析一样去一段一段的去解析Json数据,而是简单的代码就能实现;缺点就是一旦遇到复杂的Json数据时就会很麻烦,而且它不能像Json解析一样只解析自己有用的数据,下面结合代码来看看就知道了,在这之前我们得去导入一个Gson的jar包,这个直接去搜索下就好了:
public class MainActivity extends Activity {
public static final String JSONDATA = "{name:张三,age:26,"
+ "phone:[131,132],score:[{id:语文,fenshu:100},"
+ "{id:数学,fenshu:120},{id:化学,fenshu:100}]}";
private TextView show;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show=(TextView) findViewById(R.id.show);
}
public void btn(View view){
Gson gson=new Gson();
Student student=gson.fromJson(JSONDATA, Student.class);
show.setText(student.toString());
}
}
(注意这里的JSONDATA与上面的格式上有一点不同,但本质一样)其实实现Gson解析的就是这两行代码
Gson gson=new Gson();
Student student=gson.fromJson(JSONDATA, Student.class);
在gson.fromJson(JSONDATA, Student.class)中第一个参数简单,就是返回的Json数据,但是这里的第二个参数是一个Bean类,在这里我贴出Bean类,也就是Student的代码:
public class Student {
/*
* 1.因为这里是用了Gson解析,所以这里的属性值都要和JSON文件的key值必须完全对应
* 2.这里一定要用public
* 3.在这里,当JSON文件里有JsonArray,那这里就得在这用ArrayList
* 4.在这里,当JSON文件里有JsonObject,那这里就得用类来表示
*/
public String name;
public int age;
public ArrayList<String> phone=new ArrayList<String>();
public ArrayList<Score1> score1=new ArrayList<Score1>();
public class Score1{
public String id;
public String fenshu;
public String toString(){
return " id:"+id+" fenshu:"+fenshu;
}
}
public String toString(){
return "name:"+name+" age:"+age+" phone:"+phone.get(0)+" "
+phone.get(1)+" score:"+score1.toString();
}
}
说明:1.在这里首先Student类中的属性值,也就是那些定义的变量name,age等,一定要和JSONDATA中的每个字段的Key值是一样的。
2.当在JSONDATA遇到JsonArray的字段类型,在Student类中用ArrayList定义,比如JSONDATA中的phone是一个JsonArray类型,那么在Student类中,就定义一个public ArrayList phone=new ArrayList()这样的ArrayList。
3.当遇到JSONDATA遇到JsonObject的字段类型时,用类来定义,在这里首先score是一个JsonArray类型,但是score[ {},{}]里面有两个JsonObject类型,所以我们将用public ArrayList score1=new ArrayList()来写,其中Score1是一个类,代表着score[ {},{}]中的{ }。
运行结果图: