Android解析JSON数据几种方式对比

Json介绍

Json(JavaScript Object Natotion)是一种轻量级的数据交换格式,具有良好的可读性和便于快速编写的特性,主要用于传送数据。Json是一种取代Xml的数据结构,相比于xml更小巧,从而减少数据传输流量和占用的带宽。

Json语法

{ } 表示对象

[ ] 表示数组

" " 表示值或属性

:   表示前面是key后面是value,value可以是字符串、数字或者另一个数组或对象

举个例子 {"name":"tom"},表示属性名为name,值是tom。[ {"name":"tom"}, {"name":"jack"}] 这个表示2个对象的数组,等价于{"name":["tom","jack"]}这是一个拥有name数组的对象。

传统方式(使用org.json包)

  下面给出生成json字符串和解析json字符串的方法。

 

    /**
     * 将对象转换成json数据
     * @param user
     * @return
     */
    public static String buildJson(User user) {
        try {
            JSONObject juser = new JSONObject();
            juser.put("name", user.getName());
            juser.put("pwd",user.getPwd());
            return juser.toString();
        }catch (JSONException e) {
            Log.e("JSON_ERROR",e.getMessage());
        }
        return null;
    }

    /**
     * 将json数据转换成对象
     * @param json
     * @return
     */
    public static User getUser(String json) {
        JSONTokener jsonTokener = new JSONTokener(json);
        try {
            JSONObject user = (JSONObject) jsonTokener.nextValue();
            if (user != null) {
                String name = user.getString("name");
                String pwd = user.getString("pwd");
                return new User(name,pwd);
            }
        }catch (JSONException e){
            Log.e("JSON_ERROR",e.getMessage());
        }
        return null;
    }

    /**
     * 将json数据转换成User集合
     * @param key
     * @param json
     * @return
     */
    public static List<User> getUsers(String key,String json) {
        List<User> list = new ArrayList<User>();
        try {
            JSONObject jsonObject = new JSONObject(json);
            if (jsonObject != null) {
                JSONArray array = jsonObject.getJSONArray(key);
                if (array != null && array.length() > 0 ) {
                    for (int i = 0; i < array.length(); i ++) {
                        JSONObject userJson = array.getJSONObject(i);
                        User  user = new User();
                        user.setName(userJson.getString("name"));
                        user.setPwd(userJson.getString("pwd"));
                        list.add(user);
                    }
                }
                return list;
            }
        }catch (JSONException e) {
            Log.e("JSON_ERROR",e.getMessage());
        }
        return null;
    }
org.json包提供了5个类,分别为JSONArray,JSONObject,JSONStringer,JSONTokener和JSONException。

JSONException 异常类

JSONStringer 有序构造

JSONObject 无序构造

JSONArray                   数组对象

JSONStringer传入的键值对是有序的,JSONObject传入的键值对是无序的,一般情况下使用JSONObject即可,但对于一些嵌套的Json以及一些JSONArray没有key只有value的情况,则使用JSONStringer。

使用类库Gson


<span style="font-size:18px;font-weight: bold;">   </span><span style="font-size:14px;"> /**
     * 使用Gson框架将对象转换成String
     * @param user
     * @return
     */
    public static String getJson(User user) {
        Gson gson = new Gson();
        return gson.toJson(user);
    }

    /**
     * 使用Gson将String转换成对象
     * @param json
     * @return
     */
    public static User getUser(String json) {
        Gson gson = new Gson();
        try {
            return gson.fromJson(json,User.class);
        }catch (Exception e) {
            Log.e("TAG",e.getMessage());
        }
        return null;
    }

    /**
     * 使用Gson将String转换成对象集合
     * @param json
     * @return
     */
    public static List<User> getUsers(String json) {
        Gson gson = new Gson();
        try {
           return gson.fromJson(json, new TypeToken<List<User>>(){}.getType());
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }</span>
类似Gson的json库常用的有Gson外还有Jackson和FastJson,对于这三个性能的对比网上众说纷纭,当然这跟他们实现的代码有很大的关系,不过个人测试后发现Jackson和FastJson的序列化和反序列化性能相当。Gson性能相比弱一些,但是很稳定。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值