JSON 的解析

       JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,是一种轻量级的数据交换格式。JSON 提供了多种语言之间完成数据交换的能力,是一种理想的数据交换格式。

       JSON 主要有如下两种数据结构:

(1)、有 key-value 对组成的数据结构。

(2)、有序集合。

        下面介绍 JSON 的解析方式:

------> 一般的解析;

------> 使用谷歌的 Gson 解析

------> 使用阿里巴巴的 fastJSON 解析(同 Gson 差不多,不介绍)

------> 从网络上解析


在 assets 目录下,新建一个 test.json;

{
  "person": {
    "name": "张三",
    "age": 25,
    "children": [
      {
        "name": "李四",
        "age":3
      },
      {
        "name": "王五",
        "age": 3
      },
      {
        "name": "小黑",
        "age": 1
      }
    ]
  }
}



(1)、一般的解析:

先从 assets 目录下读取文件:

    /**
     *  读取 Assets 文件夹下的 test.json
     */
    private String readFromAssets() {
        InputStream is = null;
        BufferedReader br = null;
        try {
            is = getAssets().open("test.json");
            br = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder("");
            String str = null;
            while ((str = br.readLine()) != null) {
                sb.append(str);
            }
            return sb.toString();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null && is != null){
                try {
                    br.close();
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }

解析从 test.json 中读取的字符串:

    /**
     *  普通解析
     */
    private void jieXiJson(String str){
        try {
            JSONObject jsonObject = new JSONObject(str);
            JSONObject person = jsonObject.getJSONObject("person");
            String name = person.getString("name");
            Integer age = person.getInt("age");
            int chiSum = person.getJSONArray("children").length();

            Log.d("JSON解析", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个");

            JSONArray children = person.getJSONArray("children");
            for (int i = 0; i < chiSum; i++) {
                String jChiName = children.getJSONObject(i).getString("name");
                int jChiAge = children.getJSONObject(i).getInt("age");
                Log.d("=========","name: " + jChiName + ", 年龄: " + jChiAge);
            }


        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

结果如下:





(2)、使用 Gson 解析:

先下载 Gson ,如下:

使用 Gson 解析需要把 JSON 转换为对象(每个 key 都要有相应的对象),要新建几个类:

------> 从 JSON 结构可以看出有 3 个孩子(李四,王五,小黑),3 个孩子都有名字和年龄。所以创建 ChildrenT 类:

ChildrenT.java :

package com.crazy.forjson;

/**
 * Created by antimage on 2016/1/3.
 */
public class ChildrenT {
    private String name;
    private int age;

    public ChildrenT(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

------> 3 个孩子都是 children ( key ) 的值 ( value ),和 person 的 name,age 都属于 person,所以新建一个类:Person:
package com.crazy.forjson;

import java.util.List;

/**
 * Created by antimage on 2016/1/3.
 */
public class Person {
    private List<ChildrenT> children;
    private String name;
    private int age;

    public List<ChildrenT> getChildren() {
        return children;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setChildren(List<ChildrenT> children) {
        this.children = children;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

现在只有 person ( key ) 没有解析了,所以新建一个有对象 person 的类,PersonT:

package com.crazy.forjson;


/**
 * Created by antimage on 2016/1/3.
 */
public class PersonT {

    private Person person;

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

所需的类创建好后就可以使用 Gson 解析了(使用 fastJSON 都需要创建这几个类):

    /**
     *  用谷歌的 Gson 解析
     */
    private void forGson(String str){

        Gson gson = new Gson();
        PersonT personT = gson.fromJson(str, PersonT.class);

        // ======================= person ======================
        Person person = personT.getPerson();
        String name = person.getName();
        int age = person.getAge();
        int chiSum = person.getChildren().size();
        Log.d("person", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个");

        // ======================= children ====================
        List<ChildrenT> chiList = person.getChildren();
        for (ChildrenT children : chiList) {
            String chiName = children.getName();
            int chiAge = children.getAge();
            Log.d("children", "姓名:" + chiName + ", 年龄:" + chiAge );
        }
    }


(3)、从网络中解析 JSON:

从网络读取信息,首先加上相应的权限:

<uses-permission android:name="android.permission.INTERNET" />

网上的资源如下:


根据图片的信息,新建几个类(和前文的创建方法一样):

先创建类 UserT :

package com.crazy.forjson.fromnet;

/**
 * Created by scxh on 2016/1/4.
 */
public class UserT {
    private String id;
    private String userName;
    private String password;
    private String email;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}



在创建包含 user 的类 UserFromNet:
package com.crazy.forjson.fromnet;

/**
 * Created by scxh on 2016/1/4.
 */
public class UserFromNet {
    private UserT user;
    private String message;

    public UserT getUser() {
        return user;
    }

    public void setUser(UserT user) {
        this.user = user;
    }

    public String getMessage() {
        return message;
    }

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



使用异步下载:

    /**
     *  从网络读取信息
     */
    private class DownloadTask extends AsyncTask<String, Void, String> {


        @Override
        protected String doInBackground(String... params) {
            String str = params[0];

            HttpURLConnection conn = null;
            BufferedReader br = null;
            try {
                URL url = new URL(str);
                conn = (HttpURLConnection)url.openConnection();

                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                conn.setConnectTimeout(5000);
                conn.connect();

                if(conn.getResponseCode() == 200){

                    InputStream is = conn.getInputStream();
                    br = new BufferedReader(new InputStreamReader(is));
                    StringBuilder sb = new StringBuilder("");
                    String str1 = null;
                    while ((str1 = br.readLine()) != null) {
                        sb.append(str1);
                    }
                    return sb.toString();
                }


            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if (br != null && conn != null) {
                    try {
                        br.close();
                        conn.disconnect();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(String forNet) {
            jieXiFromNet(forNet);

        }
    }



其中的方法 jieXiFromNet(String forNet):

    /**
     *  解析从网络读取的字符串 json
     */
    private void jieXiFromNet(String forNet) {
        Gson gson = new Gson();
        UserFromNet ufn = gson.fromJson(forNet, UserFromNet.class);
        String message = ufn.getMessage();
        Log.d("User 的 信息", "信息: " + message);

        //=======================
        UserT ut = ufn.getUser();
        String id = ut.getId();
        String userName = ut.getUserName();
        String password = ut.getPassword();
        String email =ut.getEmail();
        Log.d("User 的详细信息", "证件号:" + id + ", 姓名:" + userName
                + ", 密码:" + password + ", 邮箱" + email);
    }

结果如下:



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值