Android使用GSON和FASTJSON解析服务器返回的JSON数据

在一个app中,没办法避免的就是网络请求这一块,那么我们在与服务器连接,发送请求的时候,就会接收到服务器返回的结果,这种结果可以是XML格式,但更多的是JSON,所以我们在客户端就必须解析JSON数据,就拿登录这一个功能举例,用户输入账号密码,客户端发送登录请求,服务器接受请求并响应发送结果返回客户端,客户端通过解析JSON数据来判断是否登录成。

首先我们在使用GSON或者FASTJSON之前都可以先看看官方的文档来了解这两个解析JSON的工具是如何实现其功能的(GSON是谷歌的,而FASTJSON是阿里巴巴的敲打

GSON文档相关:http://www.oschina.net/p/google-json

FASTJSON文档相关:https://github.com/alibaba/fastjson


在GSON和FASTJSON中,一般都会通过创建JavaBean来通过get方法获取JSON内部的数据

例如下面这个User.class

<span style="font-size:14px;">public class User{
        private String type;
        private String message;
        private int code;

        public String gettype() {
            return type;
        }

        public void settype(String type) {
            this.type = type;
        }

        public String getmessage() {
            return message;
        }

        public void setmessage(String message) {
            this.message = message;
        }

        public int getcode(){
            return code;
        }

        public void srtcode(int code){
            this.code = code;
        }
    }
</span>
然后再在网络请求成功后,如下调用:(其中的code对应的结果代码是由接口后台设置而定)

<span style="font-size:14px;">private void loginAsyncHttpClientPost(String userName,
                                          String userPass) {
        // 发送请求到服务器
        AsyncHttpClient client = new AsyncHttpClient();
        String url = getString(R.string.user_login_post_url);//请求接口
        // 创建请求参数
        RequestParams params = new RequestParams();
        params.put("stuid", userName);
        params.put("password", userPass);
        // 执行post方法
        client.post(url, params, new AsyncHttpResponseHandler() {

            @Override
            public void onSuccess(int statusCode, Header[] headers,
                                  byte[] responseBody) {
                //解析返回的JSON数据
                <span style="color:#ff0000;">String jsonData = new String(responseBody);
                Gson gson = new Gson();
                User user = gson.fromJson(jsonData, User.class);</span>

                if(user.getcode() == 1){
                    Toast toast2 = Toast.makeText(getApplicationContext(),"登录成功!",Toast.LENGTH_SHORT);
                    toast2.show();
                    Intent intent3 = new Intent(LoginActivity.this, MainActivity.class);
                    startActivity(intent3);
                    LoginActivity.this.finish();
                }else if(user.getcode() == 2){
                    AlertDialog alert = new AlertDialog.Builder(LoginActivity.this).create();
                    //设置Title的内容
                    alert.setTitle("错误");
                    //设置Content来显示一个信息
                    alert.setMessage("抱歉!您的账号与密码不匹配,请确认后重新输入!");
                    //显示弹窗
                    alert.show();
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers,
                                  byte[] responseBody, Throwable error) {
                // 打印错误信息
                error.printStackTrace();
            }
        });

    }
</span>

同样的FASTJSON也可以按这种写法,此外,还有一种简单的写法,即使用FASTJSON 的写法

直接贴代码:

<span style="font-size:14px;">public void onSuccess(int statusCode, Header[] headers,
                                  byte[] responseBody) {
                //GSON解析返回的JSON数据
                String jsonData = new String(responseBody);

                JSONObject user = JSON.parseObject(jsonData);

                Log.e("***登录信息返回***",""+user.get("message"));
</span>
通过这种写法不用再新增一个java类就可以解析JSON数据,如果返回的JSON是多层嵌套的,写法如下:

<span style="font-size:14px;">            public void onSuccess(int statusCode, Header[] headers,
                                  byte[] responseBody) {
                //解析返回的JSON数据
                String jsonData = new String(responseBody);

                JSONObject msg = JSON.parseObject(jsonData);//msg为第一层json数据
                JSONObject psmg = msg.getJSONObject("data");//pmsg为第二层个人详细信息json数据


                Log.e("***查询第一层信息返回结果***",""+msg.get("message"));
                Log.e("***查询第二层信息返回结果***",""+psmg.getJSONObject("username"));</span>


这种写法在使用的时候,已知的数据类型,即假设已知JSON返回的code是INT类型,那么我们在使用的时候应写成msg.getInteger("code") == 0来获取,不然可能会出现数据类型不符合的问题,假设不知道类型或者返回的是data,那么就用msg.getJSONObject("data")来获取它。

此外,本人为在校学生,如果有不同或者是更好的写法亦或者是错误的地方,还请指出和多多分享,共勉~奋斗





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值