网络编程之Json解析方式与Gson方式解析两兄弟的行为和特点

对于移动开发得人来说,网络编程中的关系就是客户端和服务器端的关系,这里我们用一个幽默通俗的比喻来解释一下:假如男生向女生发出约会的请求,(一般来说应该男生要主动的~~),在这里我们就可以把男生当成客户端,女生就是服务器端,客户端向服务器端发送请求;

假如女生同意了,那么就会回复男生,那女生可以用好多种方式回复,有可能是短信,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[ {},{}]中的{ }。
运行结果图:运行图

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值