Android实战技巧之五十二:fastjson

53 篇文章 160 订阅
52 篇文章 0 订阅

1、JSON

JSON全称为JavaScript Object Notation,是一种轻量级的数据交换格式。
正因为数据格式简单,所以占用带宽小,网络传输的速度更快些。这一点是老前辈xml的硬伤。

JSON的语法也很简单:
数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组

下面是微信公众帐号开发中获取token的JSON返回值

{"access_token":"I73NddJk_1GPgvVSrYC13w5omdanuiVdj7zvf8YDj1x0IYUDmQxdiMik-IkQwluPd1pWvt6IaM5NI3CnpsKxVWMlYbsrRaAyDJJQTlApesmbA8E4a0xtRWo5sE_e2lDZSZOfAFAZGV","expires_in":7200}

2、fastjson

首先,fastjson是互联网三巨头之一阿里巴巴推出的开源的Java处理JSON的工具库,号称是目前最快的JSON解析库。版本仍在不断升级中,势头很好。
对于国人出的开源作品,个人还是有些情感倾向的。从事软件这一行10载,所用所看皆为外国货,心中难免不爽。国内互联网巨头们不断将自己的代码开源,是一件令人振奋的事情。
所谓有舍才有得,这样的开源事件,让我们能够感觉到大器与国际化。开源并得到同行认可,也彰显其技术实力。最终的结果就是,名利双收。
github地址:https://github.com/alibaba/fastjson

3、简单用法

不同的场景要用不同的jar包,通常我们会下载源码后编译,但对于没有编译环境的童鞋还是很苦恼的,只少目前为止我没有找到官方jar包下载地址。

3.1 Java端用法

1、解析上面token值
通常的做法是建一个Java类对应解析内容,比如叫Access。

package com.linc;

public class Access {
    private String access_token;
    private String expires_in;

    public Access() {}

    public Access(String access_token,String expires_in) {
        this.access_token = access_token;
        this.expires_in = expires_in;
    }

    public String getAccess_token() {
        return access_token;
    }
    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }
    public String getExpires_in() {
        return expires_in;
    }
    public void setExpires_in(String expires_in) {
        this.expires_in = expires_in;
    }
}

而此时的解析代码只需一句:

        Access accessParse = JSON.parseObject(JSON_STRING,Access.class);
        System.out.println("parser: "+accessParse.getAccess_token());

2、生成JSON串并解析Access的list

Access access = new Access("adgdfjlkjlkjsdlkfjslkjf","68900");
List<Access> accessList = new ArrayList<Access>();
accessList.add(access);
Access access2 = new Access("lincyang","12345");
accessList.add(access2);
String tmp2 = JSON.toJSONString(accessList);
System.out.println(tmp2);
List<Access> list = JSON.parseObject(tmp2,new TypeReference<List<Access>>(){});  
System.out.println("get 1: "+list.get(1).getAccess_token());

3、解析网络返回值

//weixin测试id
private static final String appId = "wxbea13caead95d9";
private static final String appSecret = "f518f8f5fe4dd731a6184e208bf37";
public String getAccessToken(){ // 获得ACCESS_TOKEN

        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                + appId + "&secret=" +appSecret;

        String accessToken = null;
        try {
            URL urlGet = new URL(url);
            HttpURLConnection http = (HttpURLConnection) urlGet.openConnection(); 

            http.setRequestMethod("GET"); //必须是get方式请求 
            http.setRequestProperty("Content-Type","application/x-www-form-urlencoded"); 
            http.setDoOutput(true); 
            http.setDoInput(true);
            System.setProperty("sun.net.client.defaultConnectTimeout", "30000");//连接超时30秒
            System.setProperty("sun.net.client.defaultReadTimeout", "30000"); //读取超时30秒

            http.connect();

            InputStream is =http.getInputStream();
            int size =is.available();
            byte[] jsonBytes =new byte[size];
            is.read(jsonBytes);
            String message = new String(jsonBytes,"UTF-8");

            Access accessParse = JSON.parseObject(message,Access.class);
            System.out.println("parser: "+accessParse.getAccess_token());
            System.out.println("timeout: "+accessParse.getExpires_in());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return accessToken;
    }

3.2 Android用法

有了上面的例子,在Android上使用也是类似的。
只不过网络操作时要有网络权限,并在workThread中进行操作。
同样的代码,直接用在Android上。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTvMessage = (TextView)findViewById(R.id.tv_message);
    mEtUrl = (EditText)findViewById(R.id.et_url);

    parseJson();
    new Thread(new Runnable() {
        @Override
        public void run() {
            getAccessToken();
        }
    }).start();
}

private void parseJson() {
        Access access = new Access("adgdfjlkjlkjsdlkfjslkjf","68900");
        String tmp = JSON.toJSONString(access);
        Log.d(TAG, tmp);

        Access accessParse = JSON.parseObject(JSON_STRING,Access.class);
        Log.d(TAG,"parser: "+accessParse.getAccess_token());
        mTvMessage.setText("parser: " + accessParse.getAccess_token());

        //arrayList
        List<Access> accessList = new ArrayList<Access>();
        accessList.add(access);
        Access access2 = new Access("lincyang","12345");
        accessList.add(access2);
        String tmp2 = JSON.toJSONString(accessList);
        Log.d(TAG, tmp2);
        List<Access> list = JSON.parseObject(tmp2,new TypeReference<List<Access>>(){});
        Log.d(TAG,"get 1: "+list.get(1).getAccess_token());
        mTvMessage.append("\nget 1: "+list.get(1).getAccess_token());
    }

参考:
1、百度百科
2、《JSON与XML的区别比较》:http://www.cnblogs.com/SanMaoSpace/p/3139186.html
3、《JSON 之FastJson解析》:http://blog.sina.com.cn/s/blog_7ffb8dd501013qas.html
4、《FastJson的基本使用》:http://blog.csdn.net/wx_962464/article/details/37612861

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值